web-dev-qa-db-ja.com

ld:gcc / clang -staticフラグを使用したOSX 10.6の-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

他の誰かがこれに遭遇しましたか、それとも他の誰もまだ影響を受けていないものですか?修正はありますか?

ありがとう

57
browneye

これは機能しません。 mangccページから:

このオプションは、すべてのライブラリ(libgcc.aを含む)も-staticでコンパイルされていない限り、Mac OS Xでは機能しません。 libSystem.dylibの静的バージョンもcrt0.oも提供されていないため、このオプションはほとんどの人にとって役に立ちません。

60
Nate

ネイトの答えによれば、完全に静的なアプリケーションは明らかに不可能です-参照man ld

-static dyldを使用しないmach-oファイルを生成します。カーネルの構築にのみ使用されます。

静的ライブラリとリンクする際の問題は、ライブラリの静的バージョンと動的バージョンの両方が同じディレクトリにある場合、動的バージョンが優先されることです。これを回避する3つの方法は次のとおりです。

  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

0
sdenham

LLVM LLDリンカーを試すこともできます-私は2つの主要なOSのビルド済みバージョンを作成しました- https://github.com/VerKnowSys/Sofin-llds

これにより、たとえば "Qemu"を適切にリンクできます。これは、Appleによってldがプリインストールされている場合は不可能です。

そして最後の1つは、libstdc ++を使用して自分でGCCをビルドすることです(できません)。

0
dmilith