静态链接ncurses到程序

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

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

#include 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 

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

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

 gcc -static hello_curses.c -o curses -lncurses 

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

编辑:

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


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

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

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

我只是在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 …
绝不允许这个计划从幼儿园gradle

(.text + 0x2a8):对cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair’:(。text + 0x2ac):对cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair’:(。text + 0x50a):对tparm' /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 init_pair’:(。text + 0x518):对_nc_putp' /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 init_color’:(。text + 0x552):对cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color’:(。text + 0x556):未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color’:(。te xt + 0x5e4):对tparm' /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 init_color’:(。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’:(。text + 0x740):对cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function can_change_color’:(。text + 0x744):对cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors’:(。text + 0x768):对cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors’:(。text + 0x76c):未定义引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function color_ 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 to未定义引用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’跟随/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的_nc_do_color': (.text+0x8de): undefined reference to ‘/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm- linux-gnueabihf / libncursesw.a(lib_color.o):函数_nc_do_color': (.text+0x8e6): undefined reference to ‘/usr/lib/gcc/arm-linux-gnueabihf/4.8/../ .. /../arm-linux-gnueabihf/libncursesw.a(lib_color.o):函数_nc_do_color': (.text+0x958): undefined reference to ‘/usr/lib/gcc/arm-linux-gnueabihf/4.8 /../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):在函数set_foreground_color': (.text+0x62): undefined reference to ‘/ usr / lib / gcc / arm -linux-gnueabihf / 4.8 /../../../ arm-linux-gnueabihf / libncursesw.a(lib_color.o):在函数set_background_color': (.text+0xa2): undefined reference to 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 to acs_map的whline': (.text+0xec): undefined reference to ‘/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf /libncursesw.a(lib_hline.o):在函数whline': (.text+0xf0): undefined reference to acs_map的whline': (.text+0xf0): undefined reference to ‘/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的wadd_wch': (.text+0x4fe): undefined reference to ‘/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 wecho_wchar': (.text+0x6dc): undefined reference to TABSIZE的wecho_wchar': (.text+0x6dc): undefined reference to ‘/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_wunctrl.o) :在函数wunctrl': (.text+0x30): undefined reference to unctrl的wunctrl': (.text+0x30): undefined reference to ‘collect2:错误:ld返回1退出状态