静态库 link 问题 Mac OS X:未找到架构 x86_64 的符号
Static library link issue with Mac OS X: symbol(s) not found for architecture x86_64
我正在尝试生成一个静态库并 link 它与一个执行二进制文件。
这是一个库函数:
#include <stdio.h>
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
这是使用库的主要功能。
#include <stdio.h>
extern int hello();
int main(int argc, char *argv[]) {
printf("%d", hello());
}
但是,当我link用静态库对象时,我有错误。
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
中使用 ar
,并且 Mac OS X 是 10.10.2 with clang-602.0.53。
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
Returns
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
来自 this page 的提示。
从 hacking CMake 生成 make 文件 (CMakeFiles/test.dir/link.txt),默认使用的 /usr/local/ar
中的 ar 似乎无法正常工作。
这是link.txt
的内容。
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar qc libtest.a CMakeFiles/test.dir/test.c.o
/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
我正在尝试生成一个静态库并 link 它与一个执行二进制文件。
这是一个库函数:
#include <stdio.h>
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
这是使用库的主要功能。
#include <stdio.h>
extern int hello();
int main(int argc, char *argv[]) {
printf("%d", hello());
}
但是,当我link用静态库对象时,我有错误。
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
中使用 ar
,并且 Mac OS X 是 10.10.2 with clang-602.0.53。
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
Returns
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
来自 this page 的提示。
从 hacking CMake 生成 make 文件 (CMakeFiles/test.dir/link.txt),默认使用的 /usr/local/ar
中的 ar 似乎无法正常工作。
这是link.txt
的内容。
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar qc libtest.a CMakeFiles/test.dir/test.c.o
/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