错误
我在构建项目时收到了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 的动态库,或者我可以使用定义的变量重建gazebo_common(以及 Image.cc.obj)FREEIMAGE_LIB
,这将防止 __declspec(import) 和 __imp_ 被添加到符号前面.
最重要的是,任何地方都没有 Dll。它不存在。我没有。我正在尝试使用静态库FreeImaged.lib
。所以我认为正确的做法是定义FREEIMAGE_LIB
,以便Image.cc.obj
在其中内置正确的符号。当然这有效,但我不明白为什么这不是更早的问题!
问题:
为什么需要为 FRCUserProgram.exe 而不是 Gazebo.exe 解析这些符号?