web-dev-qa-db-fra.com

Référence non définie à «dlsym»

J'ai vu beaucoup de messages similaires, mais j'ai essayé toutes les astuces du livre et je continue de me battre. Tout fonctionnait bien, mais après l'installation/la suppression de wirehark avec certains composants/dissélecteurs, tout a été gâché. Je ne me souviens pas exactement quelles bibliothèques/packages ont été désinstallés, mais probablement beaucoup plus que ce que j'ai remarqué.

Si je crée un simple fichier main.cpp comme celui-ci:

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

et essaye

g ++ main.cpp -lsqlapi -ldl

cela me donne les messages d'erreur suivants:

/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

J'ai essayé de mettre -ldl avant -lsqlapi car certains ont suggéré que l'ordre était important. Si j'utilise gcc au lieu de g ++, l'erreur est:

/usr/bin/ld: /tmp/ccwBI4tj.o: undefined reference to symbol '__gxx_personality_v0@@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

Je peux compiler et exécuter le fichier si SAConnection est supprimé.

Je ne pense pas que cela ait quoi que ce soit à voir avec SQLAPI, car je rencontre des problèmes similaires avec libboost. Je n'ai pas de petit exemple de code, mais lorsque je compile un projet qui a été compilé avec succès la semaine dernière, j'obtiens l'erreur:

/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

Ce projet utilise un Makefile qui n'a pas été modifié, il doit donc y avoir quelque chose sur mon système qui n'est pas correct. J'ai essayé de réinstaller build-essential.

Utilisation d'Ubuntu 64 bits 13.10 avec g ++ version 4.8.1.

19
evinje

J'ai trouvé la solution; définition de -Wl, - no-as-needed avant -ldl La nouvelle commande de compilation est

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

Apparemment, cela a quelque chose à voir avec les versions récentes de gcc/ld par défaut pour la liaison avec - comme nécessaire.

43
evinje