У меня есть библиотека C++ и приложение C++, которое пытается использовать функции и классы, экспортированные из библиотеки. Библиотека компилируется нормально, и приложение компилируется, но не удается связать. Я получаю следующие ошибки:
app-source-file.cpp:(.text+0x2fdb): undefined reference to `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
"lib-namespace" не является допустимым пространством имен, каково настоящее имя символа?





U перед _ZN3lib-namespace12GetStatusStrEi в выходных данных nm показывает, что в библиотеке используется символ неопределенный.
Возможно, он определен в неправильном пространстве имен: похоже, вы вызываете его в пространстве имен lib, но вы можете определять его в другом.
Любое предложение о том, как определить символ? Файл cpp, в котором он находится, определенно компилируется!
Я только что отредактировал свой ответ: возможно, вы использовали его не в том пространстве имен
Прошло некоторое время, но если вы укажете библиотеку с параметром -l, то разве у вас нет префикса пропуска библиотеки?
(Я изменил имя с «lib-in-question.so» на «libfoobar.so» для облегчения чтения в примере ниже)
g++ -fPIC -Wall -O3 -L~/project/lib/release -lfoobar
или же
g++ -fPIC -Wall -O3 ~/project/lib/release/libfoobar.so
В моем make-файле этот бит правильный: библиотека - libzclocksupport, но команда компоновщика - -lzclocksupport
Вы не предоставляете нам достаточно информации; следовательно, вы получите много неверных предположений. Вы, наверное, просто сделали простую ошибку. Упростите код, необходимый для минимального воспроизведения ошибки. Затем опубликуйте его вместе с фактическими командами оболочки и их выводом, которые приводят к ошибке.