1

次のようなメイクファイルを作成しました。

COMPILER = g++
COMPILER_FLAGS = -c -g -O0 -Wall -w
EXEC=mhu9_mp3
LD = g++
LINKER = g++

mhu9_mp3 : mhu9_mp3.o teapot.o EasyBMP.o 
    $(LD) teapot.o mhu9_mp3.o EasyBMP.o -L./SOIL/lib -lSOIL -o mhu9_mp3 -L./usr/lib -lGL -lGLU -lglut -lGLEW 

teapot.o : teapot.cpp teapot.h
    $(COMPILER) $(COMPILER_FLAGS) teapot.cpp

mhu9_mp3.o : mhu9_mp3.cpp teapot.h 
    $(COMPILER) $(COMPILER_FLAGS) mhu9_mp3.cpp 

EasyBMP.o : EasyBMP_1.06/EasyBMP.cpp 
    $(COMPILER) $(COMPILER_FLAGS) EasyBMP_1.06/EasyBMP.cpp

clean:
    -rm -f *.o mhu9_mp3

wherelibSOIL.aは静的ライブラリ (" -L./SOIL/lib -lSOIL" を使用してリンクしました) で、 -lGL -lGLU -lglut -lGLEW は動的ライブラリです。私はそれらを同じ行にまとめました。私の cpp ファイルには、 SOIL.h で定義された関数を呼び出す関数呼び出しがあります。ただし、コンパイルすると、次のエラーが発生しました。

undefined reference to `SOIL_load_image'

SOIL.hヘッダー ファイルをインクルードしたことと、スタティック ライブラリにリンクしたことは確かですlibSOIL.a。では、このエラーの理由は何ですか? -staticの前にフラグを追加しようとしました-lSOILが、リンカーは他の動的ライブラリが静的であると誤って想定しています。静的ライブラリと動的ライブラリを同時にリンクするより良い方法はありますか?

4

2 に答える 2

0

の対応物-staticは です-Bdynamic。あなたが本当にしなければならないなら、それは次のようなものかもしれません

ld -o foo foo.o -static -lstaticlib -Bdynamic -ldynamiclib0 -ldynamiclib1

ただし、これは動的ライブラリと静的ライブラリの両方が存在する場合にのみ意味があります。1 つしか存在しない場合、リンカーはそれ自体を選択します。

あなたの場合、問題はリンクの順序が間違っているか、SOIL_load_image実際に欠落していることが原因である可能性があります( または で確認してnmくださいobjdump)。

于 2013-11-07T06:46:41.677 に答える
0

動的ライブラリのリストを静的ライブラリのリストの前に置きます。

例:

$(LD) -L<path> -l<dynamiclib1> -l<dynamiclib2> -static -l<staticlib1> -l<staticlib2>
于 2013-11-07T07:57:07.483 に答える