Подтвердить что ты не робот

Undefined ссылка на 'dlsym'

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

Если я создаю простой файл 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 вместо g++, ошибка:

/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.

4b9b3361

Ответ 1

Я нашел решение; установка -Wl, - no-as-needed перед -ldl. Новая команда компиляции

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

По-видимому, он имеет какое-то отношение к последним версиям gcc/ld по умолчанию для связи с -as-needed.