GCC и ld не могут найти экспортированные символы ... но они там есть
-
03-07-2019 - |
Вопрос
У меня есть библиотека C ++ и приложение C ++, пытающееся использовать функции и классы, экспортированные из библиотеки.Библиотека создается нормально, и приложение компилируется, но не удается установить связь.Ошибки, которые я получаю, следуют этой форме:
app-source-file.cpp :(.текст+0x2fdb):неопределенная ссылка на `lib-пространство имен::GetStatusStr(int)'
Классы в библиотеке, похоже, отлично разрешаются компоновщиком, но свободные функции и экспортированные данные (например, таблица поиска косинусов) неизменно приводят к приведенной выше ошибке.
Я использую Ubuntu 8.04 (Hardy), и он обновлен с последними пакетами Ubuntu.
Команда для связывания библиотеки (с удалением других библиотек):
g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
Команда для связывания приложения (с удалением других библиотек):
g++ -fPIC -Wall -O3 -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
Наконец, кажется (насколько я могу судить), что рассматриваемые символы экспортируются должным образом:
nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
Решение
U перед _ZN3lib-namespace12GetStatusStrEi в выводе nm показывает, что символ находится в библиотеке undefined .
Возможно, он определен в неправильном пространстве имен: похоже, вы вызываете его в пространстве имен lib, но вы можете определить его в другом.
Другие советы
Прошло некоторое время, но если вы укажете библиотеку с параметром -l, то разве у вас нет возможности пропустить префикс lib?
(Я изменил название с "либерал-в-вопрос.так" до "libfoobar.так что" для облегчения чтения на примере ниже)
g++ -fPIC -Wall -O3 -L~/project/lib/release -lfoobar
или
g++ -fPIC -Wall -O3 ~/project/lib/release/libfoobar.so