私は、以下のように同じ内容を持つ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
が解決される方法
のですか?
- それはアーカイブのインデックスに従ってますか?
- それは我々が
ar
を使用してアーカイブを移入した順序に従ってますか?
どのように私はこの順序を変更することができますか?
- にはどうすれば重複したシンボルを持っていることから
ar
防ぐことができますか?
コンパイラ:グラム++ 4.6.3
シンボル_Z3addiiが解決される方法
がある場合にエラーを与える伝統的なアーカイブの一部のリンクを行うことができますアーカイブ全体を読み込みますこんにちは、私はちょうどclangでこれを試しました。 2つの.oファイルで直接コンパイルすると重複シンボルエラーが発生しますが、2つの.oファイルを.aファイルに入れてコンパイルするとエラーは発生しません。私はいつも.aファイルがたくさんの.oファイルを持つ便利な方法だと思っていましたが、いくつかの点で異なっているようです。 – xaxxon
arの 'r'フラグは、アーカイブに後で追加されたものが以前のものに置き換わることを意味するようですが、代わりにqを実行しても、重複するシンボルエラーを得ることはできません。リンカーは、それがおそらく探しているシンボルの最初のエントリを参照すると、単一のファイルを見るのをやめますか? – xaxxon
@xaxxon: '2つの.oファイルを使ってコンパイルすると、重複したシンボルエラーが発生します。はい、しかし、私は便宜のためにこれを常に好んでいるわけではありません – sjsam