GNU对共享库中定义的函数进行未定义的引用

时间:2016-08-04 06:29:48

标签: c makefile

我正在尝试链接到共享库。但我一直得到未定义的引用错误。以下是makefile:

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 $@ -c $< -L$(LIBDIR) $(LIB) 

$(OBJDIR)/%.o: %.c %.h | $(OBJDIR)
    cc -o $@ -c $<

$(OBJDIR):
    mkdir $@


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

共享库名为libminus,它放在./lib目录中。 main中的main.c函数使用此库中定义的函数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

任何人都可以提出一些建议吗?谢谢。

1 个答案:

答案 0 :(得分:2)

您将lib内容放入错误的规则中:

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

这只会将main.c编译为main.o-L$(LIB)不属于此处。它们必须在此规则的构建配方中,该规则链接可执行文件:

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