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

时间:2010-09-27 03:52:30

标签: macos gcc ld

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

#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

有没有其他人遇到过这个问题,还是其他人没有受到影响?任何修复?

由于

3 个答案:

答案 0 :(得分:54)

这不起作用。来自man的{​​{1}}页面:

  

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

答案 1 :(得分:0)

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

这个允许我链接为例子:&#34; Qemu&#34;正确 - 这对于Apple预装的ld是不可能的。

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

答案 2 :(得分:0)

根据Nate的回答,显然不可能使用完全静态的应用程序-另请参见

  

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

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

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

      

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

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

      

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

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

      

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