2016-04-11 15 views
0

私は、コマンドの最後にCPPファイルと私のコードをコンパイルすることはできませんことに気付きました:GCC静的リンクの順番が

[email protected]$ g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor main.cpp 
/tmp/ccxlyIri.o: In function `main': 
main.cpp:(.text+0x10c): undefined reference to `createDevice' 
collect2: error: ld returned 1 exit status 

私はディレクティブをリンクする前にそれらを置く場合は、それが正常にコンパイルされます。

[email protected]$ g++ main.cpp -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor 
[email protected]$ 

私はいくつかの説明herethereを読んだが、それはコンパイルされるソースではなく、ライブラリー・ライブラリの依存関係に来るとき、私はまだかなりそれを得ることはありません。私は、コンパイラが常にコードを最初にコンパイルし、リンカしか呼び出さないと考えていました。その場合、main.cppから構築されたオブジェクトファイルは、リンクプロセスの開始前でもcreateDeviceの機能が必要であることを知っておく必要があります。私のミスはどこですか?

P.S. This質問、重複として提案、それを全く説明していない。

答えて

1

のショートカットを1つのコマンドでコンパイルしてリンクすると混乱することがあります(多くの人に見られるように)。あなたが明示的に両方の手順を実行する場合は、例えば、どうなる

# g++ invokes the C++ compiler (cc1plus). The linkage options are ignored. 
g++ -c -o deleteme.o main.cpp 

# g++ invokes the system linker (ld). The linkage options are passed. 
g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -o a.out deleteme.o 
rm deleteme.o 

g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor main.cpp 

は、機能的に同等のショートカットですリンク手順で

# Compile step 
g++ -c -o main.o main.cpp 
# Link step. 
g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -o prog main.o 

、G ++ひそかリンカーにそれを渡し、その後、コマンドラインにホスト システムのデフォルトC++リンケージ・オプションを追加します。 C++コンパイラは ではありません。

デフォルトでは、それはコマンドライン・リンケージ・シーケンスで に遭遇した場合、リンカは、最も一度ライブラリを検討する、とライブラリは、以前で参照されるすべてのこれまで未解決のシンボルを解決できる場合にのみ を見るために、それは、ライブラリを調べます 結合配列。リンケージシーケンスの最後に、すべての参照シンボルが と解決された場合、リンクは成功し、そうでない場合は失敗します。

リンケージ:すべてのライブラリは、任意のオブジェクトファイルの前に表示されるので、

g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -o a.out deleteme.o 

は失敗します。各ライブラリ に到達すると、リンカはまだ未解決のシンボルを発見していないので、ライブラリは無視されます。 リンカが最終的に末尾のオブジェクトファイルに到達し、未解決の シンボルを検出すると、それらは未解決のままです。

逆に、

g++ main.cpp -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor 

は同等です:リンク順序で

g++ -c -o deleteme.o main.cpp  
g++ -o a.out deleteme.o -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor 
rm deleteme.o 

は、それらを提供するライブラリの前に発見された定義 を必要とするシンボルで、正しいです。

関連する問題