来自C ++源代码的C-DLL

时间:2009-10-26 08:59:41

标签: c++ c dll scons extern

我的C ++ Framework有一个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文件,我很确定我需要它才能真正使用该库。

1 个答案:

答案 0 :(得分:0)

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

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