Разрешение символов в статических библиотеках. Когда это происходит?

Ошибка

Я получил 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?

0 ответов

Другие вопросы по тегам