题
我的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&quot;''但它总是让我感到像“错误C2732:链接规范与'......'的早期规范相矛盾。
如果我跳过'extern'C&quot;'它工作但我没有看到.lib文件,我很确定我需要它来真正使用该库。
解决方案
您应该只需要声明中的 extern&quot; C&quot;
。任何包括该标题的人都希望使用C链接标准链接它,而不是C ++装饰形式。如果包含 warplib.h
, warplib.cpp
源文件和后续目标文件将正确公开函数 foo
。
使用MSVC时,有许多半有用的脚本,以及“构建环境”。提供了控制台快捷方式,提供了许多与dev相关的环境变量和路径。我建议找到一个合适的脚本来执行,以将这些变量插入您的环境,或运行开发控制台。
不隶属于 StackOverflow