Статически связать ncurses с программой - PullRequest
8 голосов
/ 18 августа 2010

У меня проблемы со статической привязкой ncurses к одной из моих программ

Вот очень простой пример программы:

#include<ncurses.h>


int main(){

    initscr();
    printw("Hello world\n");
    refresh();
    getch();
    endwin();
    return 0;
}

Когда я компилирую это с

gcc -static -lncurses hello_curses.c -o curses

Я получаю эти ошибки:

/tmp/ccwHJ6o1.o: In function `main':
curses_hello.c:(.text+0x5): undefined reference to `initscr'
curses_hello.c:(.text+0x14): undefined reference to `printw'
curses_hello.c:(.text+0x1b): undefined reference to `stdscr'
curses_hello.c:(.text+0x20): undefined reference to `wrefresh'
curses_hello.c:(.text+0x27): undefined reference to `stdscr'
curses_hello.c:(.text+0x2c): undefined reference to `wgetch'
curses_hello.c:(.text+0x31): undefined reference to `endwin'
collect2: ld returned 1 exit status

Я немного запутался, почему это не работает. Что мне здесь не хватает?

Ответы [ 3 ]

27 голосов
/ 18 августа 2010

Вам необходимо передать -l опции в конце командной строки:

gcc -static hello_curses.c -o curses -lncurses

Когда компилятор встречает -lfoo, он связывает все запрошенные символы из fooпо предыдущему файлу.Если вы поставите -lfoo в начале, ни один символ еще не был запрошен, поэтому ни один символ не будет связан.

6 голосов
/ 18 августа 2010

Изменить:

Я думаю, что настоящая проблема в том, что вам нужно указать опцию -l в конце команды. Я просто попробовал так, как ты это сделал, и воспроизвел твою ошибку. Если я поставлю -l:libncurses.a в конце строки, то это сработает. Все без опции -static Кстати.


Я думаю, что у вас есть динамическая библиотека для ncurses, но вы использовали опцию -static, что означает не использовать любых динамических библиотек. Я подозреваю, что на самом деле у вас нет статической версии библиотеки ncurses, т.е. заканчивающейся суффиксом .a.

Если вы хотите связать со статической версией (.a) ncurses, а не с динамической версией (.so), временно удалите символическую ссылку для libncurses.so, чтобы компоновщик взял файл .a. Либо скопируйте файл .a в другое место и добавьте его в более ранний путь поиска.

В качестве альтернативы, если ваш компоновщик поддерживает его (например, ld), вы можете указать -l:libncurses.a вместо -lncurses.

1 голос
/ 29 сентября 2016

Я просто провел несколько часов на процессоре ARM, пытаясь заставить его работать, так как принятый ответ не работал для меня.

Вот мои выводы:

Видимо

gcc -static hello_curses.c -o curses -lncurses

работает на процессоре x64, но не на процессоре ARM.

Когда я пытался использовать приведенную выше строку, я все еще получал все «неопределенные ошибки ссылок» (и многое другое) в OP.

Вам также необходимо создать ссылку на libtinfo.a и учесть, что последовательность имеет значение.
Это правильная командная строка, которая работает:

gcc -static hello_curses.c -o curses -lncurses -ltinfo

Если вы перепутаете последовательность, она не будет работать ...

gcc -static hello_curses.c -o curses -ltinfo -lncurses 

неопределенная ссылка на `unctrl '

Конечно, это также работает, если вы используете: lib синтаксис

Это компилируется

gcc -static hello_curses.c -o curses -l:libncursesw.a -l:libtinfo.a

Это не компилируется

gcc -static hello_curses.c -o curses -l:libtinfo.a -l:libncursesw.a 

О, как мне нравится GCC ...
Эта программа никогда не должна была допускаться до окончания детского сада

(. Text + 0x2a8): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair ': (.text + 0x2ac): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair ': (.text + 0x50a): неопределенная ссылка на tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair': (.text + 0x518): неопределенная ссылка на _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color ': (.text + 0x552): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color ': (.text + 0x556): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color ': (.text + 0x5e4): неопределенная ссылка на tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color ': (.text + 0x5f2): неопределенная ссылка на _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function can_change_color ': (.text + 0x740): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function can_change_color ': (.text + 0x744): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors ': (.text + 0x768): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors ': (.text + 0x76c): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function color_content ': (.text + 0x7c2): неопределенная ссылка на cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):(.text+0x7c6): more undefined references to cur_term 'следовать /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): В функции _nc_do_color': (.text+0x8de): undefined reference to тпармь /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): В функции _nc_do_color': (.text+0x8e6): undefined reference to tputs ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): В функции _nc_do_color': (.text+0x958): undefined reference to tputs ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): В функции set_foreground_color': (.text+0x62): undefined reference to tputs ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): В функции set_background_color': (.text+0xa2): undefined reference to tputs ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o): В функции whline': (.text+0xec): undefined reference to acs_map ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o): В функции whline': (.text+0xf0): undefined reference to acs_map ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): В функции wadd_wch': (.text+0x4fe): undefined reference to TABSIZE ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): В функции wadd_wch': (.text+0x502): undefined reference to TABSIZE ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): В функции wecho_wchar': (.text+0x6d8): undefined reference to TABSIZE ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): В функции wecho_wchar': (.text+0x6dc): undefined reference to TABSIZE ' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_wunctrl.o): В функции wunctrl': (.text+0x30): undefined reference to unctrl ' collect2: ошибка: ld вернул 1 состояние выхода

...