Неопределенная ссылка при использовании ncurses в Linux - PullRequest
10 голосов
/ 30 апреля 2009

Я пытаюсь начать разработку программы с использованием ncurses в Linux. Я даже не могу получить пример Hello World для компиляции. Вот код:

#include <curses.h>

int main()
{         
        initscr();
        printw("Hello, world.");
        refresh();
        getch();
        endwin();
        return 0;
}

Когда я пытаюсь скомпилировать, я получаю:

hello.c:(.text+0x12): undefined reference to `initscr'

Для каждой из этих вызываемых функций.

Я установил ncurses через apt-get, а также скачал исходники и скомпилировал, установил и т. Д.

Я пробовал #include и curses.h, и ncurses.h.

Что происходит?

Ответы [ 4 ]

13 голосов
/ 30 апреля 2009

Использовали ли вы опцию -lcurses при связывании?

Включение заголовочных файлов позволяет скомпилировать код (поскольку компилятор знает, как выглядит вызов функции из файла .h), но компоновщику нужен файл библиотеки, чтобы найти фактический код для ссылки на вашу программу. *

12 голосов
/ 30 апреля 2009

Как сказал Грег Хьюгилл, вам нужно ввести -lcurses или -lncurses для ссылки на библиотеку curses.

gcc -o hello hello.c -lncurses

Вы также, вероятно, хотите использовать initscr() и getch(). После того, как я произвожу эти замены, вышеприведенные компиляции для меня.

4 голосов
/ 19 июня 2012

Для тех, у кого есть похожие проблемы: аргументы -lx, где x - ваша библиотека, всегда должны следовать за исходными и объектными файлами

3 голосов
/ 28 марта 2013

У меня была похожая проблема, и я нашел решение, которое мне помогло, но немного отличалось от других ответов, опубликованных здесь. Я пытался использовать библиотеку панелей с проклятиями, и моя команда компиляции была:

$ gcc -o hello hello.c -lncurses -lpanel

Когда я прочитал другие ответы, я был озадачен, потому что у меня было , включая флаг -lncurses, но он все еще не компилировался, и с ошибками, аналогичными тем, которые вы получали:

$ gcc -o hello hello.c -lncurses -lpanel
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libpanel.a(p_new.o): In function `new_panel':
p_new.c:(.text+0x18): undefined reference to `_nc_panelhook'

Я наконец нашел свой ответ в tldp :

"Чтобы использовать функции библиотеки панелей, вы должны включить файл panel.h и связать программу с библиотекой панелей, после чего необходимо добавить флаг -lpanel вместе с -lncurses в этом порядке."

Итак, похоже, что порядок важен при использовании флагов компиляции! Я попытался переключить порядок:

gcc -o hello hello.c -lpanel -lncurses

Это позволило успешно компилироваться. Я знаю, что у вас уже есть свой ответ, поэтому я надеюсь, что это кому-нибудь поможет.

...