为什么我只为MSVC(VS2015)共享库构建获得链接器错误?

时间:2017-07-14 13:26:27

标签: c++11 visual-studio-2015 cmake linker-errors c++-standard-library

我目前正在用c ++开发一个简单的游戏引擎。为了使我的构建过程跨平台,我一直在使用cmake。我已经达到了这样的程度,即我将大部分代码库构建为我的测试代码链接的库。这适用于在linux上使用gcc的静态和共享库构建,也适用于在Windows上使用msvc的静态库构建,但是对于使用msvc的共享库构建,我收到了数千个链接器错误。

所述错误的一些示例如下(这是针对Debug构建的)

Error   LNK2001 unresolved external symbol __purecall   CuttingEdge 
C:\Projects\Test\CuttingEdge\Build\assimp-vc140-mt.lib(3DSConverter.obj)

Error   LNK2019 unresolved external symbol _malloc referenced in function 
"void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)  CuttingEdge 
C:\Projects\Test\CuttingEdge\Build\MSVCRTD.lib(new_scalar.obj)  1

Error   LNK2001 unresolved external symbol ___CxxFrameHandler3  CuttingEdge 
C:\Projects\Test\CuttingEdge\Build\Material.obj 1

值得注意的是,发生这些错误的三个地方:我的共享库静态链接的几个依赖项,共享库本身,以及我理解为windows c ++运行时实现之一的MSVRTD.lib。 / p>

根据我的理解,这里缺少的符号应该由windows c ++运行时提供,所以我假设我的项目链接与共享库构建的链接有一些问题。

根据我发现的调查问题的信息,我尝试了一些事情:

  • 确保共享库项目及其相关项目的项目设置具有相同的字符集设置
  • 确保共享库项目及其相关项目的项目设置设置为使用相同的运行时库(/ MDd)
  • 确保共享库项目及其相关项目使用相同的配置构建(调试)
  • 我之前没有使用__declspec(dllexport)从我的共享库中导出类/函数,但现在已经将它放到了位置,这对链接器错误没有任何影响

这个问题让我觉得与windows c ++运行时相关的构建选项有点关系,它似乎是由visual studio cmake生成器设置的,我想这可能正确配置这些设置。

0 个答案:

没有答案