2011-12-15 11 views
3

オブジェクトファイルとライブラリに同じシンボルが定義されている場合、GNUリンカはオブジェクトファイルからシンボルを取得します。複数の定義済みシンボルのC/C++リンカの順序

Iからコンパイルされた「MYLIB」の両方foo.cppに、ソースファイルに同じシグネチャを持つ機能 fooを定義した場合
g++ -L"dir/to/lib" -o Executable Test.o foo.o -lMyLib 

、GNUリンカが常にあれば、元から1を好む:この例を考えてみましょう私はこの命令を使う。

この現象はGNU toolchainに固有のものですか?同じように動作する他のリンカーからも知っていますか?これはどこに文書化されていますか(GNUドキュメンテーション、C++標準)?私は何も見つけることができませんでした...

ユニットテスト(別名リンクシーム)を行っている間に特定の機能を置き換える/模擬するために、この機能を使用したいと思います。 http://gcc.gnu.org/onlinedocs/gcc/Link-Options.htmlから

+0

オブジェクトファイルは実行可能ファイルを形成します。ライブラリは**未定義のシンボル**を解決するために使用されます。したがって、実行可能ファイルはすべての主要な機能を提供します。MyLib(と他のライブラリ)が静的であるかダイナミックであるかに大きく依存します。静的ライブラリの場合、明確に定義されています。動的ライブラリの場合、実行時動的リンカに依存し、各OSによって異なります。 –

答えて

3

多分。

リンカーが与えられたファイルを正確にどのように処理するかは、リンカー に依存しますが、あなたが記述した正確なケースでは、 は任意のバリエーションとは思われません。オブジェクトファイルを指定すると、は最終ビルドにが含まれ、 が含まれています。 2つのオブジェクトファイルで同じシンボルが定義されている場合は、通常、リンカーから というエラーが発生します(弱い記号またはデータ定義の Fortranのような例外のため例外があります)。ライブラリは、オブジェクトファイルのコレクション です。ライブラリの標準的な取り扱いは、 へのリンカのためのものであり、 が定義していない任意のオブジェクト(およびそのオブジェクトのみ)を組み込んでいます。 ライブラリ内のオブジェクトファイルが問題のシンボルのみを定義しており、その定義に明示的に指定されたオブジェクトファイルによって解決済みの がある場合、リンカ はライブラリからのオブジェクトファイルをプログラムに組み込みません。 ライブラリーのオブジェクトファイルでも他のシンボルが定義されている場合は、 があり、そうでない場合は未定義の外部が解決されます。 ファイルがライブラリに組み込まれます。複数の の定義につながる可能性があります。

8

:言語の観点により、

0

「は、指定された順序でリンカ検索とライブラリを処理し、オブジェクトファイル」、「リンク順序は、」指定されていない、として使用することはできません信頼できる方法。

プラットフォーム(ツールチェーン)の観点から、何らかの方法で指定する必要があります。また、ローカルで解決されていないすべてのシンボルのオブジェクトやオブジェクトで解決されていないすべてのシンボルのライブラリを考慮します。 これにより、開発者はライブラリ関数をマスク/置換できます。

gcc(msvcとして)は、リンカを起動するコマンドラインと同じ順序でリンクします。この動作が「信頼できる」(将来のリリースで維持されるという意味で)かどうかは不明です。 (GCCのドキュメントは現在の動詞を使って書かれています...)

+1

すべてのUnixリンカは、与えられた順に厳密に与えられたファイルを処理します。これはVSの場合ではなく**です。 VSは、まるで連結されているかのように、すべてのファイルを一度に処理します(多かれ少なかれ)。したがって、Unixで 'a.o -lb c.o'を指定すると、' c.o 'の未解決の外部は 'libb.a'には見つかりません。 VSでは、 'a.obj b.lib c.obj'を指定すると、それらが実行されます。 –

関連する問題