将库添加到我的makefile中

时间:2015-09-30 04:16:40

标签: c makefile

我已经设置了一个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在某种程度上是错的?

2 个答案:

答案 0 :(得分:1)

您的$(EXECUTABLE)规则未提及该库,只是尝试关联main.oword.otrim.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)在所有符号定义之后,所有构建规则都应该在文件下移动