GCC и ld не могут найти экспортированные символы ... но они есть - PullRequest
3 голосов
/ 19 октября 2008

У меня есть библиотека C ++ и приложение C ++, пытающееся использовать функции и классы, экспортированные из библиотеки. Библиотека прекрасно работает, и приложение компилируется, но не может связать. Я получаю следующие ошибки:

app-source-file.cpp :(. Text + 0x2fdb): неопределенная ссылка на `lib-namespace :: 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

Ответы [ 2 ]

8 голосов
/ 19 октября 2008

U перед _ZN3lib-namespace12GetStatusStrEi в выводе nm показывает, что символ равен undefined в библиотеке.

Возможно, оно определено в неправильном пространстве имен: похоже, вы вызываете его в пространстве имен lib, но вы можете определить его в другом.

2 голосов
/ 19 октября 2008

Прошло много времени, но если вы укажете lib с параметром -l, тогда у вас нет пропуска префикса lib?

(я изменил имя с "lib-in-question.so" на "libfoobar.so" для удобства чтения в приведенном ниже примере)

g++ -fPIC -Wall -O3  -L~/project/lib/release -lfoobar

или

g++ -fPIC -Wall -O3  ~/project/lib/release/libfoobar.so
...