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

bro*_*eye 53 macos gcc ld

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

#include <stdio.h>

int main(void)
{
  printf("hello world\n");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

gcc -static -o blah blah.c
Run Code Online (Sandbox Code Playgroud)

它返回:

ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有没有其他人遇到过这种情况,还是其他人没有受到影响呢?任何修复?

谢谢

Nat*_*ate 61

这不行.从man页面gcc:

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

  • 谢谢。这对我有用纯粹是因为我对逆向工程感兴趣:P (2认同)
  • @browneye - 你能弄清楚如何在没有静态的情况下在 mac 上进行逆向工程吗??? (2认同)

sde*_*ham 6

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

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

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

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

    $ g++ -Wall -Werror -o hi /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 hi.cpp

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

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