GCC и ld не могут найти экспортированные символы ... но они там есть

StackOverflow https://stackoverflow.com/questions/216450

Вопрос

У меня есть библиотека 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top