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

发布于 2024-09-25 04:38:47 字数 373 浏览 1 评论 0原文

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

#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

有其他人遇到过此问题,还是没有其他人受到影响?有修复吗?

谢谢

When I try to build the following program:

#include <stdio.h>

int main(void)
{
  printf("hello world\n");
  return 0;
}

On OS X 10.6.4, with the following flags:

gcc -static -o blah blah.c

It returns this:

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

Has anyone else encountered this, or is it something that noone else has been affected with yet? Any fixes?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

柒夜笙歌凉 2024-10-02 04:38:47

这行不通。从 gccman 页面:

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

This won’t work. From the man page for gcc:

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.

最舍不得你 2024-10-02 04:38:47

根据 Nate 的回答,完全静态的应用程序显然是不可能的 - 另请参见 ma​​n 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

Per Nate's answer, a completely static application is apparently not possible - see also man ld:

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

The problem in linking with static libraries is that, if both a static and a dynamic version of a library are found in the same directory, the dynamic version will be taken in preference. Three ways of avoiding this are:

  1. Do not attempt to find them via the -L and -l options; instead, specify the full paths, to the libraries you want to use, on the compiler or linker command line.

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

  2. Create a separate directory, containing symbolic links to the static libraries, use the -L option to have this directory searched first, and use the -l option to specify the libraries you want to use.

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

  3. Instead of creating a link of the same name in a different directory, create a link of a different name in the same directory, and specify that name in a -l argument.

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

在巴黎塔顶看东京樱花 2024-10-02 04:38:47

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

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

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

You may also try LLVM LLD linker - I did prebuilt version for my two major OSes - https://github.com/VerKnowSys/Sofin-llds

This one allows me to link for exmple: "Qemu" properly - which is impossible with ld preinstalled by Apple.

And last one is - to build GCC yourself with libstdc++ (don't).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文