静态链接ncurses到程序

mdo*_*ogg 8 c compiler-construction gcc ncurses static-libraries

我有一些问题静态地将ncurses链接到我的一个程序

这是一个非常简单的示例程序:

#include<ncurses.h>


int main(){

    initscr();
    printw("Hello world\n");
    refresh();
    getch();
    endwin();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我用它编译它

gcc -static -lncurses hello_curses.c -o curses
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

/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
Run Code Online (Sandbox Code Playgroud)

我有点困惑为什么这不起作用.我在这里错过了什么?

Gil*_*il' 27

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

gcc -static hello_curses.c -o curses -lncurses
Run Code Online (Sandbox Code Playgroud)

当编译器遇到时-lfoo,它会链接foo前一个文件请求的所有符号.如果你放在-lfoo开头,还没有请求任何符号,所以没有符号被链接.


Tro*_*our 6

编辑:

我认为真正的问题是你需要-l在命令的末尾指定你的选项.我只是按照你的方式尝试它并重现你的错误.如果我放在线-l:libncurses.a的末端然后它工作.所有没有-static选项BTW.


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

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

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


Ste*_*ger 5

我只是在 ARM 处理器上花了几个小时,试图让它工作,因为接受的答案对我不起作用。

以下是我的发现:

显然

gcc -static hello_curses.c -o curses -lncurses
Run Code Online (Sandbox Code Playgroud)

适用于 x64 处理器,但不适用于 ARM 处理器。

当我尝试使用上面的行时,我仍然收到OP的所有“未定义的引用错误”(以及更多)。

您还需要链接 libtinfo.a,并注意顺序很重要。
这是正确的有效命令行:

gcc -static hello_curses.c -o curses -lncurses -ltinfo
Run Code Online (Sandbox Code Playgroud)

如果你把顺序搞混了,那就不行了……

gcc -static hello_curses.c -o curses -ltinfo -lncurses 
Run Code Online (Sandbox Code Playgroud)

对“unctrl”的未定义引用

当然,如果您使用 :lib 语法,这也有效

这编译

gcc -static hello_curses.c -o curses -l:libncursesw.a -l:libtinfo.a
Run Code Online (Sandbox Code Playgroud)

这不能编译

gcc -static hello_curses.c -o curses -l:libtinfo.a -l:libncursesw.a 
Run Code Online (Sandbox Code Playgroud)

哦,我多么喜欢 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): 对 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioninit_pair' 的未定义引用: (.text+0x50a): 对 init_pair' 的未定义引用: (.text+0x518): 对init_colortparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function的未定义引用 _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function': (.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): 对 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioninit_color 的未定义引用': (.text+0x5e4): 对 tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioninit_color 的未定义引用': (.text+0x5f2): 未定义的引用到 _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioncan_change_color': (.text+0x740): 对 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In functioncan_change_color' 的未定义引用: (.text+0x744): 对 has_colors' 的未定义引用 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function: (.text+0x768): 对 has_colors' 的未定义引用 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function: (.text+0x76c):对 color_content' 的未定义引用 cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function:(.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) :在函数_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 totputs' /usr/lib/gcc/arm- linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):在函数set_background_color': (.text+0xa2): undefined reference totputs' /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退出状态