0

错误

我在构建项目时收到了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.libGazebo_common.lib

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

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

但是,当我这样做时,我会unresolved external symbol __imp_FreeImage_InitializeImage.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 解析这些符号?

4

0 回答 0