Référence indéfinie pour les bibliothèques, alors comment pourrais-je trouver le bon chemin?

J’essaie de comstackr un exemple v4l2 dans Ubuntu mais j’obtiens l’erreur suivante:

guilherme@notedev01:~/Downloads/V4l2_samples-0.4.1$ make gcc -O2 -L/usr/include -lX11 -lXext -o viewer viewer.c /tmp/ccUjnjWQ.o: In function `image_destroy': viewer.c:(.text+0x234): undefined reference to `XDestroyImage' viewer.c:(.text+0x256): undefined reference to `XFreeGC' viewer.c:(.text+0x277): undefined reference to `XShmDetach' viewer.c:(.text+0x2ac): undefined reference to `XFreePixmap' /tmp/ccUjnjWQ.o: In function `image_create': viewer.c:(.text+0x305): undefined reference to `XCreateGC' viewer.c:(.text+0x31d): undefined reference to `XGetWindowAtsortingbutes' viewer.c:(.text+0x39e): undefined reference to `XShmCreateImage' viewer.c:(.text+0x3f5): undefined reference to `XShmAttach' viewer.c:(.text+0x44e): undefined reference to `XCreateImage' viewer.c:(.text+0x494): undefined reference to `XShmQueryExtension' viewer.c:(.text+0x4b4): undefined reference to `XShmPixmapFormat' viewer.c:(.text+0x4dc): undefined reference to `XShmCreatePixmap' /tmp/ccUjnjWQ.o: In function `image_put': viewer.c:(.text+0x54c): undefined reference to `XPutImage' viewer.c:(.text+0x586): undefined reference to `XShmPutImage' /tmp/ccUjnjWQ.o: In function `main': viewer.c:(.text.startup+0x18b): undefined reference to `XOpenDisplay' viewer.c:(.text.startup+0x1b1): undefined reference to `XScreenOfDisplay' viewer.c:(.text.startup+0x1ee): undefined reference to `XCreateSimpleWindow' viewer.c:(.text.startup+0x249): undefined reference to `XMapRaised' viewer.c:(.text.startup+0x263): undefined reference to `XStoreName' viewer.c:(.text.startup+0x280): undefined reference to `XGetWindowAtsortingbutes' viewer.c:(.text.startup+0x92f): undefined reference to `XPending' viewer.c:(.text.startup+0x94c): undefined reference to `XNextEvent' viewer.c:(.text.startup+0xaee): undefined reference to `XPending' viewer.c:(.text.startup+0xb0b): undefined reference to `XNextEvent' viewer.c:(.text.startup+0xf39): undefined reference to `XPending' viewer.c:(.text.startup+0xf56): undefined reference to `XNextEvent' collect2: error: ld returned 1 exit status make: *** [viewer] Error 1 

Ce que je peux voir, c’est que le chemin pour -lx11 et -lXext n’est pas -L / usr / include. Comment puis-je trouver le bon chemin pour ces bibliothèques?

Merci.

Comme Chris l’a fait remarquer, l’ordre est erroné, vous devez mettre -lX11 -lXext après le code source / object-fichiers.

En effet, les compilateurs modernes tentent d’optimiser le résultat final et de ne pas établir de lien avec les bibliothèques inutilisées. ils le font en conservant une liste de symboles non résolus dans un object et en utilisant des fichiers binarys qui apparaissent dans les arguments de l’éditeur de liens pour résoudre ces symboles.

Exemple

votre test de programme utilise la fonction do_foo() de libfoo et la fonction do_bar_do() de libbar .

vous liez en utilisant:

 $ gcc -o test test.o -lfoo -lbar 

L’éditeur de liens recherche d’abord test.o et remarque que certains symboles ( do_foo et do_bar_do ) ne sont définis nulle part. il passe ensuite à libfoo (spécifié juste après test.o ) et trouve qu’il fournit do_foo , il crée donc du code pour l’utiliser depuis votre programme. do_bar_do n’est toujours pas résolu jusqu’à ce que l’éditeur de liens vérifie libbar .

envisagez de le faire dans le mauvais sens:

 $ gcc -o test -lfoo test.o -lbar 

l’éditeur de liens vérifiera d’abord libfoo et verra qu’il ne contient aucun symbole non résolu. cool. il passera ensuite à test.o et notera do_bar_do et do_foo . do_bar_do est résolu par la libbar droite mais do_foo n’est pas du tout résolu et vous obtenez une erreur:

référence indéfinie à `do_foo ‘

“mais le code est censé être un tutoriel …”

alors pourquoi ça ne marche pas?

les anciens compilateurs étaient un peu laxistes quant à l’ordre des dépendances (ils vérifieraient tous les binarys / bibliothèques / objects si un symbole donné pouvait être résolu); c’est pourquoi vous pouvez toujours trouver du code là-bas qui met les bibliothèques à lier avant les fichiers object.

Le -lX11 -lXext doit venir après le viewer.c dans la ligne de commande (et devrait probablement être dans l’ordre -lXext -lX11 ). Assurez-vous également que les libx11-6-dev et libxext6-dev sont installés.

Les bibliothèques système se trouvent généralement dans /lib et /usr/lib , et vous n’avez pas besoin d’utiliser -L pour spécifier ces répertoires.