2010-06-22 152 views
4

我有一個我創建的DLL作爲C++ Win32應用程序。爲了防止名字在我的DLL壓延,我用下面定義的導出定義:extern「C」DLL:調試是可以的,釋放拋出錯誤C2059

#ifndef EXPORT 
#define EXPORT extern "C" __declspec(dllexport) 
#endif 

EXPORT int _stdcall SteadyFor(double Par[], double Inlet[], double Outlet[]); 

爲了得到這個代碼編譯,我不得不進入該項目的屬性,並設置C/C++ Calling Convention__stdcall(/Gz)並將Compile As設置爲編譯爲C++代碼(/ TP)

這在調試模式下工作,但釋放模式在我的所有EXPORT功能上投擲error C2059: syntax error: 'string' - 即使我已將發佈模式設置配置爲與調試設置相同。

如何獲取發佈模式進行編譯?

問候,
〜喬
(Visual Studio 2008專業開發下)

編輯:
了很多關於我的#define,這似乎並沒有被引起任何問題的意見。

爲了消除混亂,我的頭文件已經被改寫爲:

#ifndef coilmodel_h 
#define coilmodel_h 

extern "C" __declspec(dllexport) int _stdcall steadyFor(double Par[], double Inlet[], double Outlet[], char* FileIn, char* FileOut); 

#endif 

這就是它的全部。

的錯誤是:
說明error C2059: syntax error: 'string'
文件coilmodel.h
4

再次,這個錯誤只出現在發行模式,而不是調試模式。
項目是一個C++ Win32 DLL應用程序。

+0

我認爲您發佈的代碼與問題無關。你能告訴我們哪些線路扼流圈以及發佈該線路的代碼嗎?從您發佈的代碼看來,您沒有在發佈模式下定義EXPORT。 – 2010-06-22 15:26:45

+0

請參閱上面的「編輯」部分。我無法在這裏解釋這一切。 – jp2code 2010-06-22 15:55:48

回答

6

如果源文件有.c擴展,您使用的編譯器將其編譯爲C(C++),併產生對extern "C"的錯誤。如果是這種情況,那麼您需要使用/TP開關,因爲您已經注意到或將該文件重命名爲.cpp。另一種解決方案是把周圍的extern的#ifdefs:

#ifdef __cplusplus 
extern "C" 
#endif 
+0

就是這樣!感謝馬克威爾金斯!實際上,我只是將文件重命名爲.cpp ...並且它工作正常!再次感謝! 〜喬 – jp2code 2010-06-22 16:06:35

2

我猜想EXPORT被定義爲Release版本中的其他內容。由於你的定義有一個#ifndef,如果它已經定義了,那麼它就不會做任何事情,那麼你在函數聲明的開頭就會得到一些其他的東西(也許是一個字符串?)。

所以也許嘗試這樣的事:

#ifdef EXPORT 
    #error EXPORT already defined! 
#else 
    #define EXPORT extern "C" __declspec(dllexport) 
#endif 
+0

這是一個好主意,但EXPORT並未事先定義。編譯器遇到了「C」問題,認爲它是一個字符串。 – jp2code 2010-06-22 15:57:05

0

Unprobable,但要確保DLLEXPORT或_stdcall不#define的...

1

強制Compile As編譯爲C++代碼(/ TP) - 您是否在所有構建配置上進行了設置 - debug/release x 32/x64等。我避免使用此選項,更容易爲編譯器命名文件自動選擇。

如果文件是C++來關閉名稱修改,則只需要"C"部分的extern "C"

我更喜歡使用這種格式來安排共享公共頭,因此您可以在內部或外部包含C/C++。

#ifdef __cplusplus 
# define NOMANGLE extern "C" 
#else 
# define NOMANGLE 
#endif 

#ifdef EXPORT_BUILD 
# define EXPORT NOMANGLE __declspec(dllexport) 
#else 
# define EXPORT NOMANGLE __declspec(dllimport) 
#endif 
+0

也許我沒有,但我當然打算!由於設置位於不同的屏幕上,因此Visual Studio不會簡化比較Debug和Release之間的設置。重命名我所有的* .c文件以包含.cpp擴展名解決了我的問題,所以我現在不回頭看! :) – jp2code 2010-06-24 13:34:35