2012-01-01 21 views
13

私はgccの-staticオプションが何をしているのだろうかと思います。-gccの静的オプション?

gcc -static -O3 -o prog prog.c 
/usr/bin/ld: cannot find -lc 
collect2: ld returned 1 exit status 

インストールを必要とするもの:特定のアプリケーションをコンパイルするとき、私は私が行うときしかし、私は次のエラーを取得するには、このオプションを必要としますか?

GCCのバージョン:

[[email protected] dir]$ gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.6.1/lto-wrapper 
Target: x86_64-redhat-linux 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux 
Thread model: posix 
gcc version 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC) 

答えて

-23

通常は、アプリケーションを静的にリンクすることを避けてください(また、通常の動的リンクを望まない理由を説明してください)。少なくとも、システムライブラリ(特にlibc)を動的にリンクすることをお勧めします。もしあなたが絶対に望むなら、あまり一般的でないライブラリを静的にリンクすることができます。なぜアプリケーションを静的にリンクしたいのですか?一般的には間違いです(システムの動的ライブラリの更新から利益を得られないため)。特にname service switchの施設では、libcから動的ライブラリが必要です。

システムには、静的なlibcライブラリを提供するパッケージがインストールされている必要があります。 Debianでは、それはlibc-devパッケージですが、私はそれがRedHat上にあるのか分かりません。

gccは、

gcc -v -static -O3 -o prog prog.c 

のようにそれを-vフラグを渡しないかを調べるために、しかし、あなたは静的にあなたのプログラムをリンクするべきではありません。私のDebianディストリビューションでは、/usr/binに700以上のプログラムがあり、静的にリンクされているのは1つだけです。

+0

私はそれが何をしているのか分かりませんでした。私は既存のアプリケーションを使用していますが、何らかの理由でmakefileにこのオプションがありました。この時点で、私はそれがもう重要ではないと思っています。ありがとう。 – sj755

+29

-1:限られたサポート事実を持つ大部分の暴言で答えを隠す。 – mattnz

5

-staticフラグは、スタティックライブラリのみではなく任意の共有ライブラリを受け入れるようにリンカを強制します。

-staticを使用する場合は、静的バージョンのCライブラリがインストールされていることを確認する必要があります。見つからない場合があります(ほとんどのシステムにはスタティックCライブラリがありません)。または、-staticの効果をキャンセルする必要があります。しかし、この例では、リンクされている唯一のライブラリが(暗黙的に)Cライブラリであるため、-staticという目的を無効にします。

+1

リンカが使用できるライブラリのコードをリンカに静的に付加させることができないようにする特別な理由はありますか?コード内の参照が実行時に解決されるようにフォーマットされていても、適切なルーチンを実行可能ファイルに添付して、実行可能ファイル内のコードを指すように参照を更新することが可能であると考えるでしょう。 – supercat

+0

@supercat:通常のアーカイブライブラリでは、個々のオブジェクトファイルは個別に識別でき、ライブラリから簡単に抽出して実行可能ファイルにリンクすることができます。私の印象(半報知)は、共有ライブラリには別々のオブジェクトファイルが同じ方法で含まれていないということです。共有ライブラリ全体を単に実行可能ファイルにリンクすることは可能かもしれないが、未使用のコードがたくさん組み込まれてしまうかもしれないと言っている。一部の大企業は、静的なリンクをすべてのものに使用することを好みます。予期しない変更のリスクはそれほどありません。 –

+1

コードが動的にロードされなければならない場合でも、インストールされたアプリケーションはデフォルトでそれぞれのライブラリのコピーを受け取るべきです。ライブラリをアップグレードする必要がある場合は、OSに各プログラムの「アップグレード設定」[ FooLib 1.7を使用しているプログラムが "FooLib 1.8"がインストールされていることに気がついた場合、1.7または1.8のいずれかでそれを実行し、選択をデフォルトとして保存することができます。そうすれば、プログラムにFooLib関連の問題がある場合、ユーザーはそれをアップグレードすることができますが、物事は自発的に変化しません。 – supercat

33

-staticオプションはプログラムを静的にリンクします。つまり、実行するために実行時に動的ライブラリに依存する必要はありません。

静的リンクを実現するには、ライブラリのアーカイブ(.a)バージョンがシステムに存在する必要があります。 so /usr/lib/libc.a /usr/lib/crt1.oなど...

現代のLinuxシステム(赤い帽子を使用している場合):バイナリがリンクするとき1)コードを挿入するか.oと.aファイルを介して実行可能ファイルに書き込む、または2)/lib/ld-linux.so(または/ lib64/ld-linux = x86-64)によって解決されるダイナミックライブラリ(.so)ファイルへの参照を入れます。そう)は、常によく知られている場所にあります。

特定のシステムでは、プログラムが静的なバージョンのものを作成する場合は、静的バージョンのdevelツールをインストールする必要があります。少なくとも、glibc-staticパッケージが必要です。 libstdC++ - 静的パッケージも必要な場合があります。

関連する問題