5

我有一个作为 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 AsCompile as C++ Code (/TP)

这在调试模式下工作,但发布模式正在引发error C2059: syntax error: 'string'我所有的导出功能 - 即使我已将发布模式设置配置为与调试设置相同。

如何获得发布模式进行编译?

问候,
~Joe
(在 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

同样,此错误仅出现在发布模式,而不是调试模式。
项目是一个 C++ Win32 DLL 应用程序。

4

4 回答 4

8

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

#ifdef __cplusplus
extern "C"
#endif
于 2010-06-22T15:59:14.750 回答
2

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

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

#ifdef EXPORT
    #error EXPORT already defined!
#else
    #define EXPORT extern "C" __declspec(dllexport)
#endif
于 2010-06-22T15:31:27.253 回答
1

强制Compile As编译为 C++ 代码 (/TP) - 你是否在所有构建配置上都设置了这个 - 调试/发布 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
于 2010-06-22T16:11:51.027 回答
0

不太可能,但请确保 dllexport 或 _stdcall 不是#defined...

于 2010-06-22T16:02:15.653 回答