2013-12-04 10 views
15

Я видел много подобных сообщений, но пытался каждый трюк в книге, и я все еще борется. Все работало нормально, но после установки/удаления wirehark с некоторыми компонентами/disselectors все это перепуталось. Я не помню, какие именно библиотеки/пакеты были удалены, но, вероятно, намного больше, чем я заметил.Неопределенная ссылка на 'dlsym'

Если я создаю простой main.cpp файл, как этот:

#include <SQLAPI.h> 
int main() 
{ 
    SAConnection con; 
    return 0; 
} 

и попробовать

g++ main.cpp -lsqlapi -ldl

это дает мне следующие сообщения об ошибках:

/usr/local/lib/libsqlapi.so: undefined reference to `dlsym' 
/usr/local/lib/libsqlapi.so: undefined reference to `dlerror' 
/usr/local/lib/libsqlapi.so: undefined reference to `dlopen' 
/usr/local/lib/libsqlapi.so: undefined reference to `dlclose' 
collect2: error: ld returned 1 exit status 

У меня есть попытался установить -ldl перед -lsqlapi, поскольку некоторые предположили, что порядок важен. Если я использую GCC вместо г ++ ошибка:

/usr/bin/ld: /tmp/ccwBI4tj.o: undefined reference to symbol '[email protected]@CXXABI_1.3' 
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 

Я могу скомпилировать и запустить файл, если SAConnection удаляется.

Я не думаю, что это имеет какое-либо отношение к SQLAPI, потому что у меня возникают аналогичные проблемы с libboost. У меня нет небольшой пример кода, но при компиляции проекта, который был успешно скомпилирован на прошлой неделе, я получаю ошибку:

/usr/bin/ld: debug/components/helloworld/HelloWorld.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv' 
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.53.0: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 

Этот проект использует Makefile, который был неизменным, поэтому он должен что-то в моей системе, что неверно. Я попытался переустановить сборку.

Использование Ubuntu 64 бит 13.10 с версией g ++ 4.8.1.

ответ

31

Я нашел решение; не устанавливая -Wl, - не-по мере необходимости, прежде чем -ldl Новая команда компиляции является

gcc main.cpp -lsqlapi -lstdc++ -Wl,--no-as-needed -ldl

Видимо, что-то делать с последними версиями GCC/Л.Д. по умолчанию для связывания с --as необходимой.

+1

Спасибо! -Wl, - no-as-needed сделал это для меня, я редактировал свою старую библиотеку в течение нескольких часов, прежде чем спотыкаться об этом. По-видимому, еще не зафиксировано в 2015 году. – Jack

+0

работает в 2016 году. Благодаря! – ShitalShah

Смежные вопросы