extern“C”DLL:调试正常,Release抛出错误C2059

时间:2010-06-22 15:22:39

标签: c++ dll extern

我有一个我作为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' - 即使我已将释放模式设置配置为与调试设置相同。

如何进行发布模式编译?

的问候,
〜乔
(在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应用程序。

4 个答案:

答案 0 :(得分:6)

如果您的源文件具有.c扩展名,则您使用的编译器会将其编译为C(而不是C ++)并在extern "C"上产生该错误。如果是这种情况,则需要使用您已经注意到的/TP开关,或将文件重命名为.cpp。另一个解决方案是将#ifdefs放在extern:

#ifdef __cplusplus
extern "C"
#endif

答案 1 :(得分:2)

我猜测EXPORT被定义为Release版本中的其他内容。既然你的定义周围有一个#ifndef,那么如果已经定义了它就不会做任何事情,那么你会在函数声明的开头粘贴其他东西(可能是一个字符串?)。

所以也许尝试这样的事情:

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

答案 2 :(得分: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

答案 3 :(得分:0)

无法修改,但请确保dllexport或_stdcall不是#defined ...