问题描述
我想为一个大型C项目创建一个Makefile,文件分为目录。我写的是
CC = gcc
AR = ar
ARFLAGS = rvs
CFLAGS += -std=c99 -Wall -g
INCDIR = ./include
LIBDIR = ./lib
SRCDIR = ./src
BINDIR = ./bin
OBjdiR = ./obj
TESTDIR = ./testfile
INCLUDES = -I.
LDFLAGS = -L/lib
LIBFUNCTIONS = /-lfunctions
LIBTH = -lpthread
LIBUTILITY = /-lutility
OPTFLAGS = -O3 -DNDEBUG
TARGETS = $(BINDIR)/test_functions \
.PHONY: all clean cleanall test1 test2
.SUFFIXES: .c .h
$(BINDIR)/%: $(SRCDIR)/%.c
$(CC) $(CFLAGS) $(INCLUDES) $(OPTFLAGS) -o $@ $<
$(OBjdiR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) $(INCLUDES) $(OPTFLAGS) -c -o $@ $<
all : $(TARGETS)
$(BINDIR)/test_functions: $(OBjdiR)/test_functions.o $(LIBDIR)/libutility.a $(LIBDIR)/libfunctions.a
$(CC) $(CFLAGS) $(INCLUDES) $(FLAGS) $(LDFLAGS) -o $@ $< $(LIBUTILITY) $(LIBFUNCTIONS)
$(OBjdiR)/test_functions.o: $(SRCDIR)/test_functions.c $(INCDIR)/utility.h $(LIBDIR)/libutility.a $(INCDIR)/functions.h $(LIBDIR)/libfunctions.a
$(CC) $(CCFLAGS) $(INCLUDES) $(FLAGS) -c -o $@ $<
$(LIBDIR)/libutility.a: $(OBjdiR)/utility.o $(INCDIR)/utility.h
$(AR) $(ARFLAGS) $@ $<
$(LIBDIR)/libfunctions.a: $(OBjdiR)/functions.o $(INCDIR)/functions.h $(INCDIR)/utility.h
$(AR) $(ARFLAGS) $@ $<
clean :
rm -f $(TARGETS)
cleanall : clean
\rm -f *.o *~
问题是,当我尝试使用makefile编译项目时,结果是
gcc -std=c99 -Wall -g -I. -L/lib -o bin/test_functions obj/test_functions.o -lutility -lfunctions
/usr/bin/ld: impossibile trovare -lutility
/usr/bin/ld: impossibile trovare -lfunctions
collect2: error: ld returned 1 exit status
make: *** [Makefile:54: bin/test_functions] Error 1
似乎编译器找不到库。我该怎么做才能使其正常工作?
解决方法
你有这个:
LIBDIR = ./lib
然后在链接行中输入以下内容:
LDFLAGS = -L/lib
注意到差异了吗?
你为什么不说:
LDFLAGS = -L$(LIBDIR)
避免重复自己(并弄错)?