【问题标题】:C-DLL from C++ source来自 C++ 源代码的 C-DLL
【发布时间】:2009-10-26 08:59:41
【问题描述】:

我的 C++ 框架有一个 C-Wrapper。因为这应该在 mac 和 windows 上运行,所以我使用 scons

env = Environment()
env.Append(CPPPATH = ['./'])
env.Append(LIBS = 'kernel32.lib')
env.Append(LIBPATH = 'C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib')

env.SharedLibrary(target='warpLib', source='warplib.cpp')

warplib.cpp 和 warplib.h 的简单版本如下所示:

warplib.cpp

#define DllExport __declspec( dllexport )
#include "warplib.h"

extern "C" {
  DllExport int foo(int a) {
    return a;
  }
}

warplib.h

#define DllExport __declspec( dllexport )

extern "C" {
  DllExport int foo(int a);
}

谁能告诉我这有什么问题?我尝试了几乎所有可能的 'extern "C"' 组合,但它总是向我抛出类似“错误 C2732:链接规范与 '...' 的早期规范相矛盾”之类的东西。

如果我跳过 'extern "C"' 它可以工作,但我看不到 .lib 文件,我很确定我需要它才能真正使用该库。

【问题讨论】:

    标签: c++ c dll scons extern


    【解决方案1】:

    您应该只需要在声明中使用extern "C"。然后,包括该标头的任何人都希望使用 C 链接标准而不是 C++ 修饰形式来链接它。如果包含warplib.hwarplib.cpp 源文件和后续目标文件将正确公开函数foo

    在使用 MSVC 时,有大量半有用的脚本,并提供了“构建环境”控制台快捷方式,并提供了许多与开发相关的环境变量和路径。我建议找到一个合适的脚本来执行以将这些变量插入到您的环境中,或者运行开发控制台。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2011-02-28
      相关资源
      最近更新 更多