2016-05-06 16 views
10

私は、以下のように同じ内容を持つ2つのファイル​​& 37064544_p2.cppを持っている:私は外部シンボルはどのように解決されますか?

g++ -c 37064544_p2.cpp -o 37064544_p2.o 
g++ -c 37064544_p2.cpp -o 37064544_p2.o 

を使用してそれらをコンパイルし

ar -rsc lib37064544pf.a 37064544_p1.o 37064544_p2.o 

を使用してアーカイブに追加し

int add(int x,int y) 
{ 
return x+y; 
} 

そして、

$ nm -s lib37064544pf.a 

は私を与える:

Archive index: 
_Z3addii in 37064544_p1.o 
_Z3addii in 37064544_p2.o 

37064544_p1.o: 
0000000000000000 T _Z3addii 

37064544_p2.o: 
0000000000000000 T _Z3addii 

$ ar -t lib37064544pf.a 

は私が

でコンパイルされている _Z3addii関数を呼び出すドライバーを持っている私に

37064544_p1.o 
37064544_p2.o 

を与える

g++ -static 37064544driver.cpp -o 37064544driver.elf -L. -l37064544pf 

結果は

Sum : 11 

質問シンボル_Z3addiiが解決される方法

  1. のですか?

    • それはアーカイブのインデックスに従ってますか?
    • それは我々がarを使用してアーカイブを移入した順序に従ってますか?
  2. どのように私はこの順序を変更することができますか?

  3. にはどうすれば重複したシンボルを持っていることからar防ぐことができますか?

コンパイラ:グラム++ 4.6.3

シンボル_Z3addiiが解決される方法
+1

がある場合にエラーを与える伝統的なアーカイブの一部のリンクを行うことができますアーカイブ全体を読み込みますこんにちは、私はちょうどclangでこれを試しました。 2つの.oファイルで直接コンパイルすると重複シンボルエラーが発生しますが、2つの.oファイルを.aファイルに入れてコンパイルするとエラーは発生しません。私はいつも.aファイルがたくさんの.oファイルを持つ便利な方法だと思っていましたが、いくつかの点で異なっているようです。 – xaxxon

+1

arの 'r'フラグは、アーカイブに後で追加されたものが以前のものに置き換わることを意味するようですが、代わりにqを実行しても、重複するシンボルエラーを得ることはできません。リンカーは、それがおそらく探しているシンボルの最初のエントリを参照すると、単一のファイルを見るのをやめますか? – xaxxon

+0

@xaxxon: '2つの.oファイルを使ってコンパイルすると、重複したシンボルエラーが発生します。はい、しかし、私は便宜のためにこれを常に好んでいるわけではありません – sjsam

答えて

2

実装は好きなように自由に行うことができ、あなたはone definition ruleに違反しています。

現実的にそれはおそらく、ファイルをアーカイブに挿入された順序に従う最初の試合、後の任意のシンボルを探して停止されます。

どのように私はこの順序を変更することができますか?

arを使用すると、それらを挿入し、あなたはまだかかわらず、ODRに違反しているときにアーカイブにオブジェクトファイルを配置するa(後)とb(前)修飾子を使用することができます。

シンボルの重複を防ぐにはどうすればよいですか?

あなたは私の知る限り、arはありません(比較的ダムとアーカイブとリンクする際に、いくつかの言語を使用すると、すべてのエラーを持っていない理由である、同一のシンボルを可能にしますと、正当な理由のためであることはできませんODR違反には診断が必要です)。

あなたはどちらかできる力ld

g++ -static 37064544driver.cpp -o 37064544driver.elf -L. \ 
-Wl,--whole-archive -l37064544pf -Wl,--no-whole-archive 

それとも、代わりに任意の重複

ld -r -o lib37064544pf.a 37064544_p1.o 37064544_p2.o 
+0

ありがとうございます。私はODRに違反していると私は同意しますが、これはこの例では目的に沿ったものですが、オブジェクトコードをアーカイブする際にこれを検出することに大きな関心が寄せられました。また、オブジェクトを別のライブラリに追加し、必要な順序でリンクすることも検討します。 – sjsam

関連する問題