解析静态库中的符号 - 什么时候发生?

时间:2015-07-01 02:10:45

标签: c++ dll linker msvc12

错误

我在构建项目时在依赖项中收到了unresolved external symbol,我想了解为什么之前这不是问题。

背景资料

项目依赖关系图如下:

FRCUserProgram.exe
 |--wpilibC++Sim.lib 
  |--gazebo.exe
  |-- gazebo.lib
   |-- gazebo_common.lib (uses freeimage in Image.cc.obj)
    |-- FreeImaged.lib

所以,我有FreeImage的头文件和静态库。

我构建gazebo_common,显式地与FreeImaged.lib

进行静态链接

我建立了凉亭,明确地与FreeImage.lib gazebo_common.lib进行静态链接

我构建了wpilibC ++ Sim,明确地与gazebo.lib和gazebo_common.lib进行了静态链接,但不是 FreeImaged.lib

我构建了我的FRCUserProgram,明确地与gazebo.lib,gazebo_common.lib和FreeImaged.lib进行了静态链接

但是,当我这样做时,我会unresolved external symbol __imp_FreeImage_Initialize来自Image.cc.obj

我做了什么来调查

现在,使用神奇的dumpbin /SYMBOLS命令,我可以清楚地看到FreeImaged.lib包含符号FreeImage_Initialize不是符号__imp_FreeImage_Initialize。我知道__imp_告诉我它是一个从DLL导入的函数。但是,一切都应该是静态链接,所以无论将这个符号放到Image.cc.obj中都做错了。

要解决此问题,我可以将FRCUserProgram.exe链接到FreeImage的动态库,或者我可以使用定义的变量FREEIMAGE_LIB重建gazebo_common(以及因此Image.cc.obj),这将阻止__declspec(import)和__imp_被添加到符号前面。

最重要的是,任何地方都没有Dll。它不存在。我没有。我正在尝试使用静态库FreeImaged.lib。所以我认为正确的做法是定义FREEIMAGE_LIB,以便Image.cc.obj获得内置的正确符号。当然这有效,但我不明白为什么这不是早期的问题!

问题:

为什么需要为FRCUserProgram.exe而不是gazebo.exe解析这些符号?

0 个答案:

没有答案