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

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

#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

还有其他人遇到过这种情况吗? 还是没有其他人受到这种情况的影响? 有什么解决办法吗?

谢谢

38248 次浏览

这样不行。在 gccman页面上:

This option will not work on Mac OS X unless all libraries (including libgcc.a) have also been compiled with -static. Since neither a static version of libSystem.dylib nor crt0.o are provided, this option is not useful to most people.

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

这一个允许我链接的例子: “ Qemu”正确-这是不可能的 LD 预安装的苹果。

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

根据 Nate 的回答,一个完全静态的应用程序显然是不可能的——参见 男人:

-static Produces a mach-o file that does not use the dyld. Only used building the kernel.

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

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

    $g + +-Wall-Werror-o hi /usr/local/lib/libost _ unit _ test _ Framework. a hi.cpp

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

    $g + +-Wall-Werror - L./staticBoostLib-l Boost _ unit _ test _ Framework-o hi hi.cpp

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

    $g + +-Wall-Werror - 升级 _ unit _ test _ Framework _ static-o hi hi.cpp