无法识别问题 GNU 归档程序。用 *.o 编译可以,但是 libname.a 不行

Unable to identify issue GNU archiver. Compiling with *.o works but libname.a dosen't

我正在尝试制作一个静态库 (.a),但遇到了我无法理解的问题。因此,简而言之,使用 *.o 编译成功,但使用 ar 归档它们,然后使用 .a 文件编译给我一个 undefined reference to 'symbol' 错误。

所以这是一个简单的代码。

test.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 World\n");
}

编译。

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

我不知道我做错了什么,所以感谢您的帮助。

这几乎是 Why does the order of '-l' option in gcc matter? 的重复 - 但通过在命令行上指定存档名称,可以在没有 -l 开关的情况下复制行为。

GCC 执行的 GNU linker 将默认从左到右 link,并且只使用库存档中需要的那些 .o 文件到目前为止 满足未定义的引用。由于您的库先于命令行上的主要翻译单元,因此在linker 处理它时不需要hello_world

解决方案是在 依赖于它的翻译 units/object 文件之后提及库 :

gcc -o test test.c libhello.a