我在构建项目时在依赖项中收到了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解析这些符号?