Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将ncurses静态链接到程序_C_Gcc_Compiler Construction_Static Libraries_Ncurses - Fatal编程技术网

将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:

我在将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:(.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