Статически связать ncurses с программой

У меня возникли проблемы со статическим связыванием 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 Я немного запутался, почему это не работает. Что мне здесь не хватает?

8
задан mdogg 18 August 2010 в 17:35
поделиться

2 ответа

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

gcc -static hello_curses.c -o curses -lncurses

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

28
ответ дан 5 December 2019 в 05:02
поделиться

Изменить:

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


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

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

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

6
ответ дан 5 December 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: