我试图了解 gcc 中的库和链接是如何工作的。我正在尝试从文件 test.c编译示例“Hello World”程序: ncurses
#include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
我首先使用以下命令编译它(没有生成文件):
gcc test.c -o test.exe -lncurses
这产生了一个 9kb 的文件。在不了解开关的作用之后,我阅读了一些关于链接的内容,然后是关于静态和动态的,并决定我想尝试在这里-lncurses
静态编译:
gcc -static test.c -o test.exe -lncurses
但是,由于某种原因,这不起作用,并产生了大量的ld
“未定义对 x 的引用”错误。例子:
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libncurses.a(lib_echo.o): In function `echo':
(.text+0x3): undefined reference to `SP'
从其他地方,我添加了一个-L/usr/lib
选项:
gcc -static test.c -o test.exe -L/usr/lib -lncurses
这创建了一个更大的文件,1103kb。
我可以理解为什么应该更大。我不明白为什么只删除-static
选项:
gcc test.c -o test.exe -L/usr/lib -lncurses
... 生成大小为 184kb 的文件,即使它没有静态链接到ncurses
库。
-L/usr/lib 选项在这里做什么?根据在线文档,它将目录“添加到要搜索的目录列表中 -l ”。/usr/lib 目录有一个libncurses.a
文件(以及其他文件),而 /usr/include 包含一个ncurses.h
符号链接到curses.h
和一个ncurses_dll.h
. 也许该libncurses.a
文件不是动态库?那是什么ncurses.h
?