Подтвердить что ты не робот

Gcc/usr/bin/ld: ошибка: не удается найти -lncurses

Я запускаю Ubuntu 12.04, и сейчас я работаю над проектом с использованием C, OpenGL, чайника и методов ввода.

Проблема началась, когда я решил использовать клавиши со стрелками. Я проверил, чтобы видеть коды клавиш для клавиш со стрелками, но все стрелки возвращают 0. Я посмотрел, как заставить это работать, и я нашел conio.h. К сожалению, это старый заголовок DOS, который недоступен для Linux. Затем я нашел замену под названием ncurses.

После установки необходимых библиотек, следуя инструкциям по сборке, я включил curses.h в мой источник main.c. Когда я впервые попытался скомпилировать gcc, я получил следующие ошибки:

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'

Я нашел исправление, добавив -lncurses в make файл так:

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

Но меня встретила другая ошибка:

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

Как и предыдущие ошибки.

Я провел последние 2 дня, просматривая как форумы Ubuntu, так и StackOverFlow. Любая помощь будет оценена.

P.S. Я не знаю, важно ли это, но когда я пытаюсь запустить /usr/bin/ld, я получаю эту ошибку:

ld: fatal error: no input files
4b9b3361

Ответ 1

Для тех, у кого такая же проблема, у меня было: мне не хватало 32-битных библиотек; Я собирал 32-разрядный бит на 64-битном сервере, которому не хватало пакет lib32ncurses5-dev.

На Ubuntu я просто запускал:

sudo apt-get install lib32ncurses5-dev

Ответ 2

Во-первых, вы должны поместить библиотеки после объектного файла при связывании. И не иметь их вообще в компиляции исходного файла.

После этого, если ncurses не установлен в стандартной папке поиска, вам нужно указать на компоновщик, где он есть, это делается с помощью опции командной строки -L:

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

Ответ 3

Попробуйте установить пакет ncurses-static, если у вас установлен только пакет ncurses-devel в вашей операционной системе Ubuntu.

Если это решает вашу проблему, плюс, если вы добавите команды компиляции @Joachim, вы можете отлично начать.

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

Компонент не может найти вашу общую библиотеку в пути поиска. Если вы добавите каталог, в котором ваша общая библиотека находится в переменной среды LD_LIBRARY_PATH, компоновщик должен найти ее и уметь ссылаться на нее. В этом случае вы можете опустить параметр -L в gcc:

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

И он должен хорошо компилироваться.

EDIT: Полезно знать, что apt-get install libncurses5-dev устраняет вашу проблему.

FYI. Переменная среды LD_LIBRARY_PATH содержит список путей, разделенных двоеточиями, который используется компоновщиком для разрешения зависимостей библиотек во время выполнения. Эти пути будут иметь приоритет над стандартными путями библиотек /lib и /usr/lib. Стандартные пути будут по-прежнему искать, но только после исчерпания списка путей в LD_LIBRARY_PATH.

Лучший способ использовать LD_LIBRARY_PATH - установить его в командной строке или script непосредственно перед выполнением программы. Таким образом, вы можете сохранить новый LD_LIBRARY_PATH изолированный от остальной части вашей системы, то есть локальный, к текущему запущенному экземпляру оболочки.

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