繁体   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