[英]extern “C” DLL: Debug is OK, Release throws Error C2059
我有一個我作為C ++ Win32應用程序創建的DLL。 為了防止在我的DLL中進行名稱修改,我使用了以下定義的EXPORT定義:
#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'
- 即使我已將Release模式設置配置為與Debug設置相同。
如何編譯發布模式?
問候,
〜喬
(在Visual Studio 2008 Professional下開發)
編輯:
關於我的#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
同樣,此錯誤僅出現在“釋放”模式下,而不是“調試”模式。
Project是一個C ++ Win32 DLL應用程序。
如果您的源文件具有.c
擴展名,則您使用的編譯器將其編譯為C(而不是C ++)並在extern "C"
上生成該錯誤。 如果是這種情況,那么您需要使用已經記下的/TP
開關,或者將文件重命名為.cpp
。 另一個解決方案是將#ifdefs放在extern周圍:
#ifdef __cplusplus
extern "C"
#endif
我猜想EXPORT
在Release版本中定義為其他東西。 因為你的定義周圍有一個#ifndef
,如果已經定義了它就不會做任何事情,那么你會在函數聲明的開頭粘貼其他東西(可能是一個字符串?)。
所以也許嘗試這樣的事情:
#ifdef EXPORT
#error EXPORT already defined!
#else
#define EXPORT extern "C" __declspec(dllexport)
#endif
強制Compile As
為編譯為C ++代碼(/ TP) - 你是否在所有構建配置上設置了這個 - debug / release x 32 / x64等。我避免使用這個選項,更容易命名文件,編譯器自動選擇。
如果文件是C ++來關閉名稱修改,你只需要extern "C"
的"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
不可能,但要確保dllexport或_stdcall不是#defined ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.