静态链接ncurses到程序

时间:2010-08-18 17:30:25

标签: c gcc compiler-construction static-libraries 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

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

3 个答案:

答案 0 :(得分:26)

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

gcc -static hello_curses.c -o curses -lncurses

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

答案 1 :(得分:6)

修改

我认为真正的问题是您需要在命令末尾指定-l选项。我只是按照你的方式尝试它并重现你的错误。如果我将-l:libncurses.a放在行尾,那么它就可以了。全部没有-static选项BTW。


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

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

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

答案 2 :(得分:1)

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

以下是我的发现:

显然

gcc -static hello_curses.c -o curses -lncurses

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

当我尝试使用上面的代码时,我仍然得到了所有&#34;未定义的引用错误&#34; OP(以及更多)OP。

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

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

如果你混淆了序列,那么它就不会工作......

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

对`unctrl&#39;

的未定义引用

当然,如果您使用: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&#39; :(。text + 0x2ac):未定义引用   cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair&#39; :(。text + 0x50a):未定义引用tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair&#39; :(。text + 0x518):未定义引用   _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color&#39; :(。text + 0x552):未定义的引用   cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color&#39; :(。text + 0x556):未定义的引用   cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color&#39; :(。text + 0x5e4):未定义的引用   tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color&#39; :(。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&#39; :(。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&#39; :(。text + 0x744):未定义的引用   cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors&#39; :(。text + 0x768):未定义的引用   cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors&#39; :(。text + 0x76c):未定义引用   cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function color_content&#39; :(。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&#39;跟随   /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&#39;   /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&#39;   /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&#39;   /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&#39;   /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&#39;   /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o):   在函数whline': (.text+0xec): undefined reference to acs_map&#39;   /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o):   在函数whline': (.text+0xf0): undefined reference to acs_map&#39;   /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&#39;   /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&#39;   /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&#39;   /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&#39;   /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_wunctrl.o):   在函数wunctrl': (.text+0x30): undefined reference to unctrl&#39;   collect2:错误:ld返回1退出状态