Mac OS X的静态库链接问题:找不到架构x86_64的符号

我正在尝试生成一个静态库并将其与执行二进制文件链接。

这是一个库函数:

#include  int hello() { return 10; } 

使用这些命令,我​​可以得到一个静态库。

 gcc -c io.c ar -crv libio.a io.o 

使用lip -info ,我检查它是x86_64架构。

 ar> lipo -info libio.a input file libio.a is not a fat file Non-fat file: libio.a is architecture: x86_64 

这是使用库的主要function。

 #include  extern int hello(); int main(int argc, char *argv[]) { printf("%d", hello()); } 

但是,当我将对象与静态库链接时,我有错误。

 gcc main.c -lio -o main -L. 

错误消息是:

 ld: warning: ignoring file ./libio.a, file was built for archive which is not the architecture being linked (x86_64): ./libio.a Undefined symbols for architecture x86_64: "_hello", referenced from: _main in main-2c41a0.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我在/bin/ar ,而使用clang-602.0.53则Mac OS X是10.10.2。

 ar> clang -v Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) Target: x86_64-apple-darwin14.3.0 Thread model: posix 

可能有什么问题?

该库应该使用libtool -static生成。

 gcc -c io.c libtool -static -o libio.a io.o gcc main.c -lio -o main -L. main 

返回

 10 ar> lipo -info libio.a input file libio.a is not a fat file Non-fat file: libio.a is architecture: x86_64 ar> file libio.a libio.a: current ar archive ar> nm libio.a io.o: 0000000000000000 T _hello 

来自此页面的提示。

从黑客攻击CMake生成make文件(CMakeFiles / test.dir / link.txt),默认使用的/usr/local/ar似乎无法正常工作。

这是link.txt的内容。

 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar qc libtest.a CMakeFiles/test.dir/test.co /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib libtest.a 

从脚本中,我必须使用/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar

 smcho@macho ar> ls -alF /usr/bin/ar -rwxr-xr-x 1 root wheel 18160 Oct 17 18:49 /usr/bin/ar* smcho@macho ar> ls -alF /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar -rwxr-xr-x 1 root wheel 33472 Oct 29 16:36 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar* 

同样,应该使用的ranlib是/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib而不是默认值。

 smcho@macho ar> ls -alF `which ar` -rwxr-xr-x 1 root wheel 18160 Oct 17 18:49 /usr/bin/ar* smcho@macho ar> ls -alF /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib lrwxr-xr-x 1 root wheel 7 Nov 10 21:10 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib@ -> libtool 

除了需要使用-qc选项之外(来自cmake生成的脚本)

  -c Whenever an archive is created, an informational message to that effect is written to standard error. If the -c option is speci- fied, ar creates the archive silently. -q (Quickly) append the specified files to the archive. If the ar- chive does not exist a new archive file is created. Much faster than the -r option, when creating a large archive piece-by-piece, as no checking is done to see if the files already exist in the archive. 

这些是获取正确库文件的命令:

 clang -c hellolib.cpp -o hellolib.o /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar -qc libhello.a hellolib.o /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib libhello.a 

用法是:

 clang usehello.cpp -lhello -L. 

nm和lipo显示正确的库文件信息:

 smcho@macho ar> nm libhello.a libhello.a(hellolib.o): 0000000000000000 T __Z3addii smcho@macho ar> lipo -info libhello.a input file libhello.a is not a fat file Non-fat file: libhello.a is architecture: x86_64