2016-08-04 11 views
0

共有ライブラリにリンクしようとしています。しかし、私は未定義の参照エラーを取得し続けた。共有ライブラリが./libディレクトリに置かれlibminusと呼ばれ、GNU共有ライブラリで定義された関数への未定義参照を作成します。

LIBDIR :=./lib 
LIB :=-lminus 
OBJDIR :=objdir 
SOURCES=$(wildcard ./src/*.c) 
OBJS :=$(patsubst ./src/%.c, $(OBJDIR)/%.o, $(SOURCES)) 

INCPATH = -Ilib -Isrc 
vpath %.h ./src ./lib 
vpath %.c ./src ./lib 
optest : $(OBJS) 
    cc -o optest $(OBJS) 

$(OBJDIR)/main.o : main.c add.h mul.h did.h minus.h 
    cc $(INCPATH) -o [email protected] -c $< -L$(LIBDIR) $(LIB) 

$(OBJDIR)/%.o: %.c %.h | $(OBJDIR) 
    cc -o [email protected] -c $< 

$(OBJDIR): 
    mkdir [email protected] 


clean : 
    rm -rf $(OBJDIR) 
    rm -f optest 
    rm -f ./src/*.o 

:以下は、メイクファイルです。 main.cmain関数は、このライブラリで定義された関数minusを使用します。私はオンラインで検索したが、人々はこの問題に以前に会った。それらの問題の大部分は、共有ライブラリがルールコマンドのオブジェクトファイルの後に置かれた後に解決されました。私もこれを試しましたが、それは私にとってはうまくいかなかったのです。私が得たエラーは次のとおりです。

mkdir objdir 
cc -o objdir/mul.o -c ./src/mul.c 
cc -o objdir/did.o -c ./src/did.c 
cc -Ilib -Isrc -o objdir/main.o -c ./src/main.c -L./lib -lminus 
cc -o objdir/add.o -c ./src/add.c 
cc -o optest objdir/mul.o objdir/did.o objdir/main.o objdir/add.o 
objdir/main.o: In function `main': 
main.c:(.text+0xa5): undefined reference to `minus' 
collect2: error: ld returned 1 exit status 
makefile:11: recipe for target 'optest' failed 
make: *** [optest] Error 1 

いずれかの提案がありますか?ありがとうございました。

答えて

2

間違ったルールの中にlibのものを入れている:

$(OBJDIR)/main.o : main.c add.h mul.h did.h minus.h 
    cc $(INCPATH) -o [email protected] -c $< -L$(LIBDIR) $(LIB) 

これはちょうどmain.oからmain.cをコンパイルします。 -L$(LIB)はここに属しません。実行可能ファイルをリンクするこのルールのビルドレシピに入っていなければなりません。

optest : $(OBJS) 
    cc -o optest $(OBJS) 
+0

はい。あなたが正しいです。私は-L $(LIB)をoptestに移動した後で動作します。どうもありがとうございます。 – Jerry

関連する問題