我已经设置了一个makefile,它接受源main.c,word.c和trim.c 我还使用了一个名为linkedList.a的库,但是即使添加它之后它也没有构建,因为我不断对链接列表中的函数进行未定义的引用。
以下是我的makefile代码:
SHELL = /bin/sh
SRCDIR = .
CC = gcc
YACC = bison -y
CDEBUG = -g
COMPLIANCE_FLAGS =
CFLAGS = $(COMPLIANCE_FLAGS) $(CDEBUG) -I. -I$(SRCDIR)
LDFLAGS = -g
LIBRARY_FILES = linkedList.a
linkedList.a: $(LIBRARY_FILES).o
$(RM) -f $(output)
$(AR) cr $(output) $(inputs)
ranlib $(output)
############################################################################################################
# List your sources here.
SOURCES = main.c word.c trim.c
############################################################################################################
############################################################################################################
# list the name of your output program here.
EXECUTABLE = wordCounter
############################################################################################################
# Create the names of the object files (each .c file becomes a .o file)
OBJS = $(patsubst %.c, %.o, $(SOURCES))
include $(SOURCES:.c=.d)
all : $(OBJS) $(EXECUTABLE)
$(EXECUTABLE) : $(OBJS)
$(CC) -o $(EXECUTABLE) $(OBJS)
%.o : %.c #Defines how to translate a single c file into an object file.
echo compiling $<
echo $(CC) $(CFLAGS) -c $<
$(CC) $(CFLAGS) -E $< > $<.preout
$(CC) $(CFLAGS) -S $<
$(CC) $(CFLAGS) -c $<
echo done compiling $<
%.d : %.c #Defines how to generate the dependencies for the given files. -M gcc option generates dependencies.
@set -e; rm -f $@; \
$(CC) $(COMPLIANCE_FLAGS ) -M $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
clean : # Delete any and all artifacts from the build. The only thing which is kept is the source code.
rm -f *.o
rm -f *.preout
rm -f *.s
rm -f *.S
rm -f *d
rm -f $(EXECUTABLE)
我觉得我在适当的地方添加了适当的物品。我最好的猜测是我的library_files在某种程度上是错的?
答案 0 :(得分:1)
您的$(EXECUTABLE)
规则未提及该库,只是尝试关联main.o
,word.o
和trim.o
。所以我们必须重写这条规则。
首先从命令行尝试这个(因为我们不能用Make做一些事情,直到我们知道如何在没有Make的情况下做到这一点):
gcc -o wordCounter main.o word.o trim.o -L. -llinkedList
如果这样可行,那么我们可以编写规则:
$(EXECUTABLE) : $(OBJS) linkedList.a
$(CC) -o $@ $(OBJS) -L. -llinkedList
如果没有,我们将不得不稍微调整一下。一旦我们让makefile工作,就可以进行一些进一步的改进。
答案 1 :(得分:0)
&#34; all:&#34; line需要增强,是的,LIBRARY_FILES需要更改/拆分。您有可执行文件的OBJS变量,但库没有类似的变量。实际上,还有一点要做,如下......
(1)目前,你有一个图书馆,但让我们选择两个:
LIBRARY_FILES += lib1.a LIBRARY_FILES += lib2.a
(2)我们现在需要两个变量,类似于你的OBJS,但是每个库都有一个变量:
LIBOBJS1 += abc.o def.o LIBOBJS2 += ghi.o jkl.o
(3)我们现在需要两个规则,每个库一个,类似于你的图书馆规则,但不同[请注意,大多数现代&#34; ar&#34;程序自己运行ranlib - YMMV]:
lib1.a: $(LIBOBJS1) ar crv $@ $(LIBOBJS1) lib2.a: $(LIBOBJS2) ar crv $@ $(LIBOBJS2)
(4)现在,更改可执行文件本身的规则:
$(EXECUTABLE): $(OBJS) $(LIBRARY_FILES) $(CC) -o $(EXECUTABLE) $(OBJS) $(LIBRARY_FILES)
(5)现在,我们需要更改&#34; all:&#34;线。随着其他规则的更改,可以将其简化为:
all: $(EXECUTABLE)
(6)现在向&#34; clean:&#34;添加一个命令。目标,:
rm -f *.a或者:
rm -f $(LIBRARY_FILES)
(7)请注意,必须注意LIBOBJS1 / LIBOBJS2不要与SOURCES / OBJS重叠。也就是说,您必须确定哪些源构建库以及哪些源严格用于可执行文件。我认为你会对此很好,但是我没有看到任何拼写你想要建立你的库的.c / .o文件的东西。
(8)在所有符号定义之后,所有构建规则都应该在文件下移动