当体系结构正确时,为什么链接器会抱怨“文件是为存档构建的,而不是正在链接的体系结构”?
Why does the linker complain “file was built for archive which is not the architecture being linked” when the architecture is correct?
当尝试构建一个使用 clang 链接静态库的二进制文件(参见下面的 MWE)时,我收到以下错误消息:
⟩⟩⟩ clang -o test bar.a test.o
ld: warning: ignoring file bar.a, file was built for archive which is not the architecture being linked (x86_64): bar.a
> Undefined symbols for architecture x86_64:
> "_bar", referenced from:
> _main in test.o
> "_foo", referenced from:
> _main in test.o
> ld: symbol(s) not found for architecture x86_64
但是架构是 正确 并且一致 (x86_64) lipo
:
⟩⟩⟩ lipo -info test.o bar.a
input file bar.a is not a fat file
Non-fat file: test.o is architecture: x86_64
Non-fat file: bar.a is architecture: x86_64
otools -hv
显示类似的输出。 所有目标文件都是为 x86_64 构建的。那么这个错误消息是什么意思?
这里有一个完整的、最小的、可工作的例子来重现上面显示的问题:
foo.c
:
int foo(void) {
return 1;
}
bar.c
:
int bar(void) {
return 2;
}
test.c
:
#include <stdio.h>
int foo(void);
int bar(void);
int main(void) {
printf("foo = %d\n", foo());
printf("bar = %d\n", bar());
}
编译:
clang -c -o foo.o foo.c
ar rcs foo.a foo.o
clang -c -o bar.o bar.c
ar rcs bar.a foo.a bar.o
clang -c -o test.o test.c
clang -o test bar.a test.o
该错误消息实际上具有误导性:问题不是体系结构不匹配,而是静态库(.a
文件)无法嵌套的事实:
⟩⟩⟩ nm bar.a
bar.a(bar.o):
0000000000000000 T _bar
(请注意 foo.a
中的条目 _foo
丢失了!)
但是由于 ar
最初是一个通用的存档实用程序,它可以毫无顾虑地通过
创建嵌套存档
ar rcs bar.a foo.a bar.o
我们可以通过列出其内容来验证:
⟩⟩⟩ ar t bar.a
__.SYMDEF SORTED
foo.a
bar.o
要解决此问题,请不要嵌套存档,而是直接打包目标文件:
rm bar.a
ar rcs bar.a foo.o bar.o
clang -o test bar.a test.o
当尝试构建一个使用 clang 链接静态库的二进制文件(参见下面的 MWE)时,我收到以下错误消息:
⟩⟩⟩ clang -o test bar.a test.o
ld: warning: ignoring file bar.a, file was built for archive which is not the architecture being linked (x86_64): bar.a
> Undefined symbols for architecture x86_64:
> "_bar", referenced from:
> _main in test.o
> "_foo", referenced from:
> _main in test.o
> ld: symbol(s) not found for architecture x86_64
但是架构是 正确 并且一致 (x86_64) lipo
:
⟩⟩⟩ lipo -info test.o bar.a
input file bar.a is not a fat file
Non-fat file: test.o is architecture: x86_64
Non-fat file: bar.a is architecture: x86_64
otools -hv
显示类似的输出。 所有目标文件都是为 x86_64 构建的。那么这个错误消息是什么意思?
这里有一个完整的、最小的、可工作的例子来重现上面显示的问题:
foo.c
:int foo(void) { return 1; }
bar.c
:int bar(void) { return 2; }
test.c
:#include <stdio.h> int foo(void); int bar(void); int main(void) { printf("foo = %d\n", foo()); printf("bar = %d\n", bar()); }
编译:
clang -c -o foo.o foo.c
ar rcs foo.a foo.o
clang -c -o bar.o bar.c
ar rcs bar.a foo.a bar.o
clang -c -o test.o test.c
clang -o test bar.a test.o
该错误消息实际上具有误导性:问题不是体系结构不匹配,而是静态库(.a
文件)无法嵌套的事实:
⟩⟩⟩ nm bar.a
bar.a(bar.o):
0000000000000000 T _bar
(请注意 foo.a
中的条目 _foo
丢失了!)
但是由于 ar
最初是一个通用的存档实用程序,它可以毫无顾虑地通过
ar rcs bar.a foo.a bar.o
我们可以通过列出其内容来验证:
⟩⟩⟩ ar t bar.a
__.SYMDEF SORTED
foo.a
bar.o
要解决此问题,请不要嵌套存档,而是直接打包目标文件:
rm bar.a
ar rcs bar.a foo.o bar.o
clang -o test bar.a test.o