我有一个我作为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应用程序。
答案 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 ...