web-dev-qa-db-fra.com

Erreur de liaison: DSO absent de la ligne de commande

Je suis plutôt nouveau sur Linux (utilisant Ubuntu 14.04 LTS 64bit), venant de Windows, et je tente de porter sur un de mes projets CUDA existant.

Lors de la liaison via

/usr/local/cuda/bin/nvcc -Arch=compute_30 -code=sm_30,compute_30 -o Main.o Display.o FileUtil.o Timer.o NeuralNetwork.o -L/usr/lib -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -lGLEW -lglfw3 -lGL -lGLU -lcuda -lcudart

Je rencontre l'erreur suivante:

/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_clipboard.c.o): undefined reference to  symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [CUDANN] Error 1

La réponse semble étroitement liée aux solutions de cet article ( Erreur de liaison étrange: DSO manquant sur la ligne de commande ), bien que mon manque d'expérience avec Linux ne me permette pas de l'adapter à mon propre problème.

Des idées sur ce que pourrait être le problème?

Voici la sortie complète lors de la compilation: https://Gist.github.com/wbolden/857eddd11e4dcb915c02

Et voici ma tentative sur un Makefile: https://Gist.github.com/wbolden/135033daae04ed0d8cf3

13
Will Bolden

Espérons que cela sera utile à ceux qui, comme moi, sont nouveaux pour Linux et ne trouvent rien de relatif à Linux particulièrement évident.

Comme indiqué par les traducteurs, je ne suis pas en mesure de créer de liens indirects et je dois donc spécifier les bibliothèques supplémentaires requises par les bibliothèques que j'utilise. Autrement dit, si je lie la bibliothèque A, qui nécessite les bibliothèques B et C, je dois relier les trois bibliothèques pour que le programme soit correctement lié.

Pour trouver quelles autres bibliothèques étaient nécessaires, j'ai utilisé la commande pkg-config, pour laquelle j'ai trouvé un guide ici . L'exécution de pkg-config --print-requires --print-requires-private glfw3 a donné le résultat suivant, qui correspond à la liste des paquets requis par glfw3.

x11
xrandr
xi
xxf86vm
gl

J'ai ensuite pu trouver quelles bibliothèques je devais inclure en exécutant pkg-config --libs, suivi du nom de la bibliothèque. Par exemple, pkg-config --libs x11 a généré -lX11.

Remarque: vous pouvez transmettre plusieurs éléments à pkg-config en entrée. 

pkg-config --libs $(pkg-config --print-requires --print-requires-private glfw3)

imprimera toutes les bibliothèques supplémentaires que vous devez lier (-lX11 -lXrandr -lXi -lXxf86vm -lGL).

Mon programme relie maintenant avec succès, j'espère que cela aidera à toute personne ayant un problème similaire.

22
Will Bolden

Votre éditeur de liens a besoin de la bibliothèque X11, vous devez spécifier -lX11 dans l'éditeur de liens

Essayer 

/usr/local/cuda/bin/nvcc -Arch=compute_30 -code=sm_30,compute_30 -o Main.o Display.o FileUtil.o Timer.o NeuralNetwork.o -L/usr/lib -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -lGLEW -lglfw3 -lGL -lGLU -lcuda -lcudart -lX11
7
Rahul R Dhobi

Utilisez les commandes suivantes pour résoudre le problème:

FLAGS=-lX11 ./configure --prefix=/usr --disable-static
make
make install
0
HuuHoangNguyen