Разрешение символов в статических библиотеках. Когда это происходит?
Ошибка
Я получил 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?