我正在尝试创建一个静态库(.a),但遇到了我无法理解的问题。因此,简而言之,使用*.o
编译成功,但使用ar
存档它们,然后使用.a
文件进行编译会给我一个undefined reference to 'symbol'
错误。
所以这里有一个简单的代码。
测试.c
#include <stdio.h>
#include <string.h>
int main()
{
hello_world();
return 0;
}
hello_world.c
#include<stdio.h>
void hello_world (void) {
printf("Hello Worldn");
}
编译。
gcc -c -o hello_world.o hello_world.c
ar crs libhello.a hello_world.o
gcc libhello.a -o test test.c
给我错误
/tmp/ccsO7AJl.o: In function `main':
test.c:(.text+0xa): undefined reference to `hello_world'
相反,这样做有效(编译并运行良好)
gcc -c -o hello_world.o hello_world.c
gcc hello_world.o -o test test.c
我不知道我做错了什么,所以任何帮助都值得赞赏。
这几乎是 为什么 gcc 中"-l"选项的顺序很重要? - 但是可以通过在命令行上指定存档名称来在没有-l
开关的情况下复制该行为。
默认情况下,GCC 执行的 GNU 链接器将从左到右链接,并且仅使用库存档中满足迄今为止未定义引用所需的.o
文件。由于库位于命令行上的主翻译单元之前,因此在链接器处理它时不需要hello_world
。
解决方案是在依赖于它的翻译单元/对象文件之后提及库:
gcc -o test test.c libhello.a