2016-08-04 41 views
0

我想鏈接到共享庫。但我不斷收到未定義的參考錯誤。以下是生成文件: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 

共享庫被稱爲libminus,這是擺在./lib目錄。 main.c中的main函數使用此庫中定義的函數minus。我在網上搜索,之前有人遇到過這個問題。在共享庫放在rule命令中的目標文件之後,大多數問題都解決了。我也試過這個,但它對我沒有用。我得到的錯誤如下:

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.cmain.o-L$(LIB)不屬於此處。他們必須在此規則的構建配方中,鏈接可執行文件:

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

是的。你是對的。在將-L $(LIB)移到optest後,它現在可以工作。非常感謝。 – Jerry