У меня возникли проблемы со статическим связыванием 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
I Я немного запутался, почему это не работает. Что мне здесь не хватает?
Вам необходимо передать параметры -l
в конце командной строки:
gcc -static hello_curses.c -o curses -lncurses
Когда компилятор обнаруживает -lfoo
, он связывает все символы из foo
, запрошенные предыдущим файлом. Если вы поместите -lfoo
в начало, то символ еще не запрошен, поэтому ни один символ не будет связан.
Изменить:
Я думаю, что настоящая проблема в том, что вам нужно указать параметр -l
в конце команды. Я просто попробовал так, как это было у вас, и воспроизвел вашу ошибку. Если я поставлю -l: libncurses.a
в конце строки, то все заработает. И все это без опции -статический
BTW.
Я думаю, что у вас есть динамическая библиотека для ncurses, но вы использовали параметр -static
, что означает не использовать какие-либо динамические библиотеки. Я подозреваю, что у вас на самом деле нет статической версии библиотеки ncurses, то есть той, которая заканчивается суффиксом .a.
Если вы хотите связать со статической версией (.a) ncurses, а не с динамической версией (.so), то временно удалите символическую ссылку для libncurses.so, чтобы компоновщик взял вместо этого файл .a. В качестве альтернативы скопируйте файл .a в другое место и добавьте его к более раннему пути поиска.
В качестве альтернативы, если ваш компоновщик поддерживает это (например, ld
), вы можете указать -l: libncurses.a
вместо -lncurses
.