我正在尝试将结合两个存档库的精简存档链接到 C 程序。
我构建了两个简单的 hello world 函数并使用以下命令构建了一个存档:
ar rcs lib1.a lib1.o
ar rcs lib2.a lib2.o
然后使用精简存档合并两个存档:
ar rcsT all_lib.a lib1.a lib2.a
然后用 gcc 编译:
gcc main.o all_lib.a -o hello
我最终收到一条错误消息:
ld:警告:忽略文件 all_lib.a,文件是为不受支持的文件格式构建的,该文件格式不是被链接的体系结构 (x86_64)
架构 x86_64 的未定义符号:“_func1”,引用自:main.o 中的 _main “_func2”,引用自:main.o 中的 _main ld:未找到架构 x86_64 的符号
如果我尝试将 main.o 与 lib1.a 和 lib2.a 直接链接,一切正常。
我在 Mac OSX 10.6.8 上使用 gcc (MacPorts gcc46 4.6.3_3) 4.6.3 和 GNU ar (GNU Binutils) 2.21。
生成文件
test1: main.o lib1.o lib2.o
gcc main.o lib1.a lib2.a -o hello
test2: main.o combine
gcc main.o all_lib.a -o hello
lib1.o: lib1.c
gcc -c lib1.c
ar rcs lib1.a lib1.o
lib2.o: lib2.c
gcc -c lib2.c
ar rcs lib2.a lib2.o
combine: lib1.o lib2.o
ar rcsT all_lib.a lib1.a lib2.a
main.o: main.c
gcc -c main.c
clean:
rm -rf *.o *.a hello
主程序
#include<stdio.h>
#include "lib1.h"
#include "lib2.h"
main()
{
printf("Hello World\n");
func1();
func2();
}
lib1.h
#include<stdio.h>
void func1();
lib2.h
#include<stdio.h>
void func2();
lib1.c
#include "lib1.h"
void func1()
{
printf("Hello World 1\n");
}
lib2.c
#include "lib2.h"
void func2()
{
printf("Hello World 2\n");
}