2

g ++を使用してmsysで簡単なopenglプログラムをコンパイルしようとしていました。驚いたことに、リンカーは未定義の参照について不平を言っていました。

$ g++ -mwindows -lopengl32 glut_md2.cpp
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x67a): undefined reference to `glGenTextures@8'
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x696): undefined reference to `glBindTexture@8'
....

しばらくグーグルで調べたところ、問題は g++ 引数の順序にある​​ことがわかりました。

$ g++ glut_md2.cpp -mwindows -lopengl32
--- all ok! ---

興味深いのは、g++ での正しい引数の順序が最初の例にあることです。あれは:

$ g++ --help
Usage: g++.exe [options] file...
....

何か不足していますか?ファイル引数の後にオプションを移動するとコンパイルが成功するのはなぜですか? Linuxでネイティブにコンパイルするときにこの問題は発生しませんでした...

4

1 に答える 1

2

コマンドラインの最後に -L と -l を付けるべきです。g++ はリンクしません。ld を呼び出して引数を渡します。ld man:

リンカーは、コマンド ラインで指定された場所で、アーカイブを 1 回だけ検索します。アーカイブが、コマンド ラインでアーカイブの前に表示されたオブジェクトで未定義のシンボルを定義している場合、リンカーはアーカイブから適切なファイルをインクルードします。ただし、後でコマンド ラインに表示されるオブジェクト内の未定義のシンボルによって、リンカーがアーカイブを再度検索することはありません。

ld -o /lib/crt0.o hello.o -lc

于 2013-09-17T11:53:01.267 に答える