无法识别问题 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
我正在尝试制作一个静态库 (.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