9

我在将 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

我有点困惑为什么这不起作用。我在这里想念什么?

4

3 回答 3

31

您需要-l在命令行末尾传递选项:

gcc -static hello_curses.c -o curses -lncurses

当编译器遇到 时,它会链接上一个文件所请求的-lfoo所有符号。foo如果您放在-lfoo开头,则尚未请求任何符号,因此没有符号被链接。

于 2010-08-18T17:46:34.157 回答
6

编辑:

我认为真正的问题是您需要-l在命令末尾指定您的选项。我只是按照您的方式尝试了它并重现了您的错误。如果我放在-l:libncurses.a行尾,那么它可以工作。-static顺便说一句,所有这些都没有选项。


我认为正在发生的事情是您有一个用于 ncurses 的动态库,但是您使用了该-static选项,这意味着不使用任何动态库。我怀疑您实际上没有 ncurses 库的静态版本,即以 .a 后缀结尾的库。

如果您想与 ncurses 的静态版本 (.a) 而不是动态版本 (.so) 链接,则暂时删除 libncurses.so 的符号链接,以便链接器选择 .a 文件。或者将 .a 文件复制到其他地方并将其添加到较早的搜索路径中。

或者,如果您的链接器支持它(例如ld),那么您可以指定-l:libncurses.a而不是-lncurses.

于 2010-08-18T17:41:14.317 回答
1

我只是在 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 functioninit_pair 的 未定义引用:(.text+0x2ac):对 init_pair 的未定义引用:(.text+0x50a):对 init_pair 的cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定义引用tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function:(.text+0x518):对 _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioninit_color的未定义引用': (.text+0x552): 对 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioninit_color 的未定义引用': (.text+0x556): 对 init_color 的未定义引用 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function': (.text+0x5e4): 对 init_color 的未定义引用 tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function': (.text+0x5f2): 未定义引用to _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioncan_change_color': (.text+0x740): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioncan_change_color': (.text+0x744): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functionhas_colors': (.text+0x768): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functionhas_colors': (.text+0x76c):未定义对 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioncolor_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 tocur_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 tparm' /usr/lib /gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):在函数 tputs _nc_do_color': (.text+0x8e6): undefined reference to '/usr/lib/gcc/arm-linux- gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):在函数tputs'/usr/lib/gcc/arm-linux-gnueabihf/4.8 _nc_do_color': (.text+0x958): undefined reference to /../ ../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):在函数 tputs set_foreground_color': (.text+0x62): undefined reference to' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm -linux-gnueabihf/libncursesw.a(lib_color.o):在函数 tputs set_background_color': (.text+0xa2): undefined reference to'/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw。 a(lib_hline.o):在函数中whline': (.text+0xec): undefined reference toacs_map' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o): 在函数whline': (.text+0xf0): undefined reference toacs_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 tounctrl' collect2:错误:ld 返回 1 退出状态

于 2016-09-29T05:28:45.153 回答