如何在Mac OS X上链接编译对象文件(hello.o)和ld?

  发布于 2023-02-13 14:57

我在Mac OS X上遇到链接目标文件的问题.追溯问题是,这是我的C hello world程序

#include 
int main(){
    printf("Hello, world!\n");
    return 0;
}

//使用gcc编译(在mac上使用clang LLVM编译器)

$ gcc -c hello.c

输出文件是与gcc的hello.o链接并运行可执行文件

$ 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

那么我需要包含哪些其他文件来链接或需要指定的架构信息?谢谢.

2 个回答
  • 作为参考,我的完整链接器选项是

    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
    

    2023-02-13 14:58 回答
  • 好的,我之前也有这个问题.是的,链接器错误的原因是因为你需要向它提供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它应该是相同的(至少它在我的系统上).

    2023-02-13 14:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有