c语言 - 无法识别问题 GNU 存档器。使用 *.o 编译有效,但 libname.a 剂量不行



我正在尝试创建一个静态库(.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

相关内容

  • 没有找到相关文章