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