簡體   English   中英

extern“C”DLL:調試正常,Release拋出錯誤C2059

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM