我在Mac OS X上遇到链接目标文件的问题。追溯问题是, 这是我的C hello世界计划
#include <stdio.h>
int main(){
printf("Hello, world!\n");
return 0;
}
//使用gcc编译(在mac上使用clang LLVM编译器)
$ gcc -c hello.c
输出文件是hello.o 与gcc链接并运行可执行文件是
$ gcc hello.o -o hello
$ ./hello
现在,我必须使用mac链接器程序ld或Ld链接目标文件而不是gcc。在这种情况下,为了让程序运行,我应该将什么参数传递给ld程序?对象文件名中的简单传递,即
$ ld hello.o
导致
ld: warning: -macosx_version_min not specified, assuming 10.6
Undefined symbols for architecture x86_64:
"_printf", referenced from:
_main in hello.o
"start", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64
那么我需要包含哪些其他文件来链接或需要指定的架构信息?谢谢。
答案 0 :(得分:7)
作为参考,我的完整链接器选项是
ld -demangle -dynamic -arch x86_64
-macosx_version_min 10.9.0
-o hello
-lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.0/lib/darwin/libclang_rt.osx.a
答案 1 :(得分:5)
好的,我之前也有这个问题。是的,链接器错误的原因是因为你需要向它提供gcc所做的所有魔术参数。发现这些的简单方法是调用-v
上的gcc
选项以显示编译阶段中执行的所有命令。在您的情况下,运行:
gcc hello.o -o hello -v
...在我的系统上,输出以行结束:
/usr/libexec/gcc/i686-apple-darwin9/4.2.1/collect2 -dynamic -arch i386 -macosx_version_min 10.5.8 -weak_reference_mismatches non-weak -o test -lcrt1.10.5.o -L/usr/lib/i686-apple-darwin9/4.2.1 -L/usr/lib/gcc/i686-apple-darwin9/4.2.1 -L/usr/lib/gcc/i686-apple-darwin9/4.2.1 -L/usr/lib/gcc/i686-apple-darwin9/4.2.1/../../../i686-apple-darwin9/4.2.1 -L/usr/lib/gcc/i686-apple-darwin9/4.2.1/../../.. test.o -lgcc_s.10.5 -lgcc -lSystem
我不知道collect2
程序是什么,但是如果你将所有这些参数都提供给ld
它应该可以正常工作(至少它在我的系统上)。