代码之家  ›  专栏  ›  技术社区  ›  jp2code

extern“c”dll:调试正常,释放throws错误C2059

  •  4
  • jp2code  · 技术社区  · 16 年前

    我有一个DLL,我创建了一个C++ Win32应用程序。为了防止我的dll中的名称损坏,我使用了下面定义的导出定义:

    #ifndef EXPORT
    #define EXPORT extern "C" __declspec(dllexport)
    #endif
    
    EXPORT int _stdcall SteadyFor(double Par[], double Inlet[], double Outlet[]);
    

    为了让这个代码编译,我必须进入项目的属性并设置C/C++。 Calling Convention 到 Y-STDCALL(/GZ) 并设置 Compile As 到 编译为C++代码(/TP) .

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

    如何获得要编译的发布模式?

    当做,
    乔
    (在Visual Studio 2008专业版下开发)

    编辑:
    很多关于我的定义的评论,似乎并没有引起任何问题。

    为了消除混淆,我的头文件被改写如下:

    #ifndef coilmodel_h
    #define coilmodel_h
    
    extern "C" __declspec(dllexport) int _stdcall steadyFor(double Par[], double Inlet[], double Outlet[], char* FileIn, char* FileOut);
    
    #endif
    

    就这些。

    错误是:
    描述 错误C2059:语法错误:“string”
    文件 coilmodel.h
    线 4

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

    4 回复  |  直到 16 年前
        1
  •  6
  •   Mark Wilkins    16 年前

    如果源文件有 .c 扩展,您正在使用的编译器将编译为C(不是C++),并在 extern "C" . 如果是这样,那么您需要使用 /TP 按您的说明进行切换或将文件重命名为 .cpp . 另一种解决方案是将ifdefs放在外部:

    #ifdef __cplusplus
    extern "C"
    #endif
    
        2
  •  2
  •   AshleysBrain    16 年前

    我猜 EXPORT 定义为发布版本中的其他内容。因为你有一个 #ifndef 围绕你的定义,如果它已经被定义了,那就什么也做不到了,然后你得到了其他的东西(可能是一个字符串?)粘贴在函数声明的开头。

    所以可以尝试这样的方法:

    #ifdef EXPORT
        #error EXPORT already defined!
    #else
        #define EXPORT extern "C" __declspec(dllexport)
    #endif
    
        3
  •  1
  •   Greg Domjan    16 年前

    强迫 Compile As 要编译为C++代码(/TP)——是否在所有构建配置上设置了这一点?调试/发布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
    
        4
  •  0
  •   Alexandre C.    16 年前

    无法设置,但请确保未定义dllexport或stdcall…