web-dev-qa-db-fra.com

gcc / usr / bin / ld: erreur: impossible de trouver -lncurses

J'utilise Ubuntu 12.04 et je travaille actuellement sur un projet impliquant C, OpenGL, une théière et des méthodes d'entrée.

Le problème a commencé lorsque j'ai décidé d'avoir des touches fléchées en entrée. J'ai vérifié pour voir les codes clés des touches fléchées mais toutes les flèches renvoient 0. J'ai recherché comment faire fonctionner cela et j'ai trouvé conio.h. Malheureusement, il s'agit d'un ancien en-tête DOS qui n'est pas disponible pour Linux. Ensuite, j'ai trouvé un substitut appelé ncurses.

Après avoir installé les bibliothèques nécessaires, en suivant attentivement les instructions de construction, j'ai #inclu curses.h dans ma source main.c. Lorsque j'ai essayé de compiler avec gcc pour la première fois, j'ai eu les erreurs suivantes:

main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'
main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'

J'ai trouvé un correctif en ajoutant -lncurses au makefile comme ceci:

SOURCES=main.c

main: main.o
    gcc -lm -lGL -lGLU -lglut -lncurses main.o -o main

main.o: main.c
    gcc -lm -lGL -lGLU -lglut -c main.c

Mais j'ai été accueilli par une autre erreur:

/usr/bin/ld: error: cannot find -lncurses

Ainsi que les erreurs précédentes.

J'ai passé les 2 derniers jours à chercher sur les forums Ubuntu et StackOverFlow. Toute aide serait appréciée.

P.S. Je ne sais pas si c'est important, mais lorsque j'essaie d'exécuter/usr/bin/ld, j'obtiens cette erreur:

ld: fatal error: no input files
31
Yrrej10

Pour toute personne ayant le même problème que moi: il me manquait les bibliothèques 32 bits; Je compilais 32 bits sur un serveur 64 bits auquel manquait le paquet lib32ncurses5-dev.

Sur Ubuntu, j'ai simplement couru:

Sudo apt-get install lib32ncurses5-dev
46
Dale

Tout d'abord, vous devez mettre les bibliothèques après le fichier objet lors de la liaison. Et pas du tout dans la compilation du fichier source.

Après cela, si ncurses n'est pas installé dans un dossier de recherche standard, vous devez indiquer à l'éditeur de liens où il se trouve, cela se fait avec le -L option de ligne de commande:

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
2

Essayez d'installer le ncurses-static package aussi, si vous n'avez que le ncurses-devel package installé dans votre système d'exploitation Ubuntu.

Si cela résout votre problème, et si vous ajoutez les instructions de compilation de @ Joachim, vous êtes bien parti.

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses

L'éditeur de liens ne peut pas trouver votre bibliothèque partagée dans son chemin de recherche. Si vous ajoutez le répertoire où se trouve votre bibliothèque partagée au LD_LIBRARY_PATH variable d'environnement que l'éditeur de liens doit trouver et pouvoir établir un lien avec lui. Dans ce cas, vous pouvez omettre le -L option pour gcc:

gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses

Et il devrait bien compiler.

EDIT: Bon de savoir que apt-get install libncurses5-dev résout votre problème.

Pour info. Le LD_LIBRARY_PATH La variable d'environnement contient une liste de chemins séparés par deux-points que l'éditeur de liens utilise pour résoudre les dépendances de bibliothèque au moment de l'exécution. Ces chemins seront prioritaires sur les chemins de bibliothèque standard /lib et /usr/lib. Les chemins standard seront toujours recherchés, mais seulement après la liste des chemins dans LD_LIBRARY_PATH a été épuisé.

La meilleure façon d'utiliser LD_LIBRARY_PATH est de le placer sur la ligne de commande ou le script immédiatement avant d'exécuter le programme. De cette façon, vous pouvez conserver le nouveau LD_LIBRARY_PATH isolé du reste de votre système, c'est-à-dire local par rapport à l'instance en cours d'exécution de Shell.

$ export LD_LIBRARY_PATH="/path/to/libncurses/library/directory/:$LD_LIBRARY_PATH"
$ gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses
1
askmish