web-dev-qa-db-ja.com

GCCおよびリンク環境変数とフラグ

GCCの公式ドキュメントの次のリンク:

http://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html

次の環境変数について説明します。

LANG
LC_CTYPE
LC_MESSAGES
LC_ALL
TMPDIR
GCC_COMPARE_DEBUG
GCC_EXEC_PREFIX
COMPILER_PATH
LIBRARY_PATH
CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
OBJC_INCLUDE_PATH
DEPENDENCIES_OUTPUT
SUNPRO_DEPENDENCIES

しかし、これらの他のコンパイルフラグについても前に聞いた/読んだことがあります。

  • Cコードをコンパイルする場合:CCCFLAGS
  • C++コードをコンパイルする場合:CXXCPPFLAGS

リンクフラグ:

  • リンク段階:LDFLAGS
  • コードがコンパイルされた後:LD_LIBRARY_PATH

CCCFLAGSCXXCPPFLAGSの意味は何ですか? gccの環境変数のofficialリストに含まれていないのはなぜですか?

17

まず、あなたが言及したすべての変数:CCCFLAGSCXXCXXFLAGSLDFLAGSLD_LIBRARY_PATHは、Unix OSファミリーに由来しています。これらの変数は、そもそもGCCとは関係がないため、マニュアルにそれらの痕跡は見られません。

これらの中で唯一の意味のある変数(GCCとの直接の関係もありません)はLD_LIBRARY_PATHです。この変数は、最近のUnixライクなOSですぐに定義できるものと思われます。これがLinux Programmer's Manualの LD.SO(8) のマンページであり、LD_LIBRARY_PATHとその目的に言及しています。ここにもう一つの抜粋があります:

LD_LIBRARY_PATH環境変数には、ロードする共有ライブラリを探すときに 動的リンカー によって検索されるコロンで区切られたディレクトリのリストが含まれています。

ディレクトリは、記載されている順序で検索されます。

指定しない場合、リンカーはデフォルトの/lib:/usr/lib:/usr/local/libを使用します。

ご覧のとおり、LD_LIBRARY_PATHは、共有ライブラリを適切にロードするためのOS固有の環境変数にすぎません。 Windowsには、この点で同様の環境変数PATHがあります。 Windowsは ダイナミックリンクライブラリ (DLL、LinuxのSO)の対応物)も検索するときに、その中にリストされているディレクトリをスキャンします。

残りの変数(CCCFLAGSCXXCXXFLAGSLDFLAGS)に関しては、歴史的な理由。 Unix時代の到来以来、ソフトウェアプロジェクトは Make (スクロールして典型的なmakefilesの例を見てください)を使用してビルドされました—先駆的なビルドツールの1つです。これらの変数は makefiles で広く使用されていたため、最終的には規則のようなものになりました(たとえば Implicit Rules を参照)。そのため、たとえばLinuxですぐに定義され、GCCを指している可能性が高いことがわかります(Linuxのネイティブツールチェーンと見なされているため)。

結論として、ポイントは:_CCCFLAGSCXXCXXFLAGSLDFLAGS、そして友人たち、彼らは過去からのほんの一部に過ぎないので;)

ボーナス


単純な古いMakeを直接使用して複雑なソフトウェアをビルドすることは、今日ではすぐに退屈でエラーが発生しやすくなります。その結果、 GNU Automake または CMake のような多数の高度なビルドシステムジェネレーターが開発されました。簡単に言うと、彼らの目標は、(おそらく)より読みやすく、保守が容易な高レベルの構文を提供して、任意のソフトウェアプロジェクトを構築するための任意の複雑なビルドシステムを定義することです。通常、プロジェクトを実際にビルドする前に、nativeビルドシステムを生成する必要があります(これは、古いmakefilesで表すこともできます。たとえば、移植性の理由から(必ずしもそうではありませんが)対応するツールのセットを使用して、この高レベルの定義から除外します。最後に、生成された(ネイティブ)ビルドシステムに対応するツールを使用してプロジェクトをビルドする必要があります(たとえば、単純な古いmakefilesの場合はMakeですが、必須ではありません)。

これらの質問をしているので、CまたはC++を使用したネイティブソフトウェア開発に飛び込もうとしているようです。もしそうなら、私はあなたに近代的なビルドシステムを選ぶことを強くお勧めします(CMakeは私の個人的な推奨です)、それをいじって、よく学んでください。

25

簡単に言えば、CCCFLAGSLDFLAGSなどは、GNU Makefile変数です。定義されている場合、これらは実際にコマンド/ルールで言及されていなくても、暗黙のルールによって使用されます

1
J.Greg