1

重複の可能性:
なぜCで数学ライブラリをリンクする必要があるのですか?

私はGCCコンパイラ(Linux上)を使用してCを学習しています。

最近、Code :: Blocksの使用からを使用するように移行しましたが、必要なライブラリに自動的にリンクされないGeanyことに気付きました。Geanyたとえば#include <math.h>、Code :: Blocksで使用する場合、それを取得し、コンパイル時に対応する数学ライブラリに自動的にリンクします。ただし、Geanyこれは行わない-lmため、コンパイルを機能させるには、数学ライブラリなどのビルドコマンドを手動で追加する必要があります。

string.hただし、ヘッダーを含め、そこから関数を使用すると、文字列ライブラリにリンクせずに正常にコンパイルされることに気付きました。何故ですか?string.hヘッダーがすべての関数自体を定義しているということですか?一部のライブラリをリンクする必要があるように見えるのに、他のライブラリはリンクする必要がない理由を誰かに説明してもらえますか。

Geany同様に、必要なライブラリに自動的にリンクするように指示した経験のある人はいますか?これにより、コンパイルが非常に簡単になります。

4

2 に答える 2

2

すべてのライブラリをリンクする必要があります。ただし、string.hヘッダー内のライブラリ関数は C ライブラリの一部であり、特に指定しない限り、デフォルトですべての C プログラムにリンクされます。対照的に、数学ライブラリ関数はデフォルトではリンクされていません。これは、多くの C プログラムがそれらを必要とせず、リンカが常に最適化されていないためです。

古代のシステムでは、数学関数が libc に含まれていた場合、すべてのプログラムのコンパイルが遅くなり、出力実行可能ファイルが大きくなり、ランタイムにより多くのメモリが必要になり、これらの数学関数をまったく使用しないほとんどのプログラムにはメリットがありません。最近は共有ライブラリのサポートが充実しており、静的にリンクする場合でも、標準ライブラリは使用されていないコードを破棄できるように設定されているため、これらのいずれも正当な理由にはなりません。
    -- C で数学ライブラリをリンクする必要があるのはなぜですか?

于 2012-10-08T08:34:47.550 に答える
1

ほとんどのシステムでは、数学ライブラリの関数のみがlibm.soorに分離されてlibm.aいます (巨大であるため)。他のヘッダー ファイルで宣言された関数はlibc.soまたはlibc.aにあり、これらは常に GCC (IDE ではありません!) によって自動的にリンクされます。

ただし、C 標準ではライブラリの編成方法が定義されていないため、いくつかの例外があります。一部の Linux システムでは、関数は別のライブラリ(または .a)time_*に取り出されます。librt.soMac OS X では、すべての C 標準ライブラリがlibSystem.dylibCommonCrypto および一部の BSD API (libkern など) とともに組み込まれています。

于 2012-10-08T08:38:32.950 に答える