将ncurses静态链接到程序
我在将ncurses静态链接到我的一个程序时遇到一些问题 下面是一个非常简单的示例程序:将ncurses静态链接到程序,c,gcc,compiler-construction,static-libraries,ncurses,C,Gcc,Compiler Construction,Static Libraries,Ncurses,我在将ncurses静态链接到我的一个程序时遇到一些问题 下面是一个非常简单的示例程序: #include<ncurses.h> int main(){ initscr(); printw("Hello world\n"); refresh(); getch(); endwin(); return 0; } 我发现以下错误: /tmp/ccwHJ6o1.o: In function `main': curses_hello.c:
#include<ncurses.h>
int main(){
initscr();
printw("Hello world\n");
refresh();
getch();
endwin();
return 0;
}
我发现以下错误:
/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
选项。我只是按你的方式试了一下,然后又重复了你的错误。如果我把-l:libncurses.a
放在行的末尾,那么它就工作了。全部不带-静态
选项
我认为现在的情况是,您有一个用于ncurses的动态库,但您使用了
-static
选项,这意味着不使用任何动态库。我怀疑您实际上没有ncurses库的静态版本,即以.a后缀结尾的版本
如果要链接到ncurses的静态版本(.a)而不是动态版本(.so),请临时删除libncurses.so的符号链接,以便链接器选择.a文件。或者,将.a文件复制到其他地方,并将其添加到先前的搜索路径中
或者,如果链接器支持它(例如,
ld
),则可以指定-l:libncurses.a
而不是-lncurses
,您需要在命令行末尾传递-l
选项:
gcc -static hello_curses.c -o curses -lncurses
当编译器遇到
-lfoo
时,它会链接上一个文件请求的foo
中的所有符号。如果你把-lfoo
放在开头,那么还没有请求任何符号,因此没有链接任何符号。我只是花了几个小时在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):
在函数
init_pair':(.text+0x2ac):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数
init_pair':(.text+0x50a):未定义对tparm'的引用
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数
init_pair':(.text+0x518):未定义对的引用
\u nc\u putp'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数
init_color':(.text+0x552):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数
init_color':(.text+0x556):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数
init_color':(.text+0x5e4):未定义对的引用
tparm'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数中
init_color':(.text+0x5f2):未定义对的引用
\u nc\u putp'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数中
can_change_color':(.text+0x740):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数中
can_change_color':(.text+0x744):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数中
具有以下颜色:(.text+0x768):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数中
具有以下颜色:(.text+0x76c):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数
color\u content':(.text+0x7c2):未定义对的引用
当前术语'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):(.text+0x7c6):
以下是对当前术语的更多未定义引用
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数\u nc\u do\u color':(.text+0x8de):未定义对的引用
tparm'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数\u nc\u do\u color':(.text+0x8e6):未定义对的引用
tputs'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数\u nc\u do\u color':(.text+0x958):未定义对的引用
tputs'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数set_foreground_color':(.text+0x62):未定义的引用
至
tputs'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_-color.o):
在函数set_background_color':(.text+0xa2):未定义的引用
至
tputs'
/usr/lib/gcc/arm-linux-gnueabihf/4.8/./../../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o):
在函数whline':(.text+0xec)中:u
gcc -static hello_curses.c -o curses -l:libtinfo.a -l:libncursesw.a