ld:在带有 gcc/clang -static 标志的 OSX 10.6 上找不到 -lcrt0.o 的库

Posted

技术标签:

【中文标题】ld:在带有 gcc/clang -static 标志的 OSX 10.6 上找不到 -lcrt0.o 的库【英文标题】:ld: library not found for -lcrt0.o on OSX 10.6 with gcc/clang -static flag 【发布时间】:2011-04-17 14:12:44 【问题描述】:

当我尝试构建以下程序时:

#include <stdio.h>

int main(void)

  printf("hello world\n");
  return 0;

在 OS X 10.6.4 上,带有以下标志:

gcc -static -o blah blah.c

它返回这个:

ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status

有其他人遇到过这种情况,还是其他人没有受到影响?有什么修复吗?

谢谢

【问题讨论】:

相关:***.com/questions/844819/how-to-static-link-on-os-x 这能回答你的问题吗? How to static link on OS X 【参考方案1】:

这行不通。来自man 页面gcc

除非所有库(包括 libgcc.a)也已使用 -static 编译,否则此选项在 Mac OS X 上不起作用。由于既没有提供静态版本的 libSystem.dylib 也没有提供 crt0.o,因此该选项对大多数人来说没有用处。

【讨论】:

谢谢。这对我很有用纯粹是因为我对逆向工程感兴趣:P @browneye - 你能弄清楚如何在没有静态的情况下在 mac 上进行逆向工程吗???【参考方案2】:

根据 Nate 的回答,完全静态的应用程序显然是不可能的 - 另请参阅 ma​​n ld

-static 生成不使用 dyld 的 mach-o 文件。仅用于构建内核。

与静态库链接的问题是,如果在同一目录中找到库的静态版本和动态版本,则将优先采用动态版本。避免这种情况的三种方法是:

    不要试图通过 -L 和 -l 选项找到它们;而是在编译器或链接器命令行上指定要使用的库的完整路径。

    $ g++ -Wall -Werror -o hi /usr/local/lib/libboost_unit_test_framework.a hi.cpp

    创建一个单独的目录,其中包含指向静态库的符号链接,使用 -L 选项首先搜索此目录,然后使用 -l 选项指定要使用的库。

    $ g++ -Wall -Werror -L ./staticBoostLib -l boost_unit_test_framework -o hi hi.cpp

    不要在不同目录中创建同名链接,而是在同一目录中创建不同名称的链接,并在 -l 参数中指定该名称。

    $ g++ -Wall -Werror -l boost_unit_test_framework_static -o hi hi.cpp

【讨论】:

【参考方案3】:

您也可以尝试 LLVM LLD 链接器 - 我为我的两个主要操作系统做了预构建版本 - https://github.com/VerKnowSys/Sofin-llds

这个允许我正确链接例如:“Qemu” - 这对于 Apple 预装的 ld 是不可能的。

最后一个是 - 用 libstdc++ 自己构建 GCC(不要)。

【讨论】:

另外值得一提 - 它可能需要 LLVM 3.9 本身和编译的 libc++ - 以支持传递给链接器的“-static -lc++”。

以上是关于ld:在带有 gcc/clang -static 标志的 OSX 10.6 上找不到 -lcrt0.o 的库的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个结构文字在 VS2013 中通过地址而不是 gcc/clang 时会损坏?

使 gcc/clang 将函数识别为内置函数

使用 GCC/CLANG 追踪代码膨胀的工具

相当于其他编译器中的 gcc/clang 的 March=native?

gcc、clang 和 msvc 的 C++ 自动矢量化要求

编译器:gcc, clang, llvm