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