makefile实现多目录文件编译

    xiaoxiao2021-03-25  115

    现要在Ubuntu上编译一个大型工程文件,假设各文件目录及关系如下:

    /home/vote:

    comlib(文件夹)

    vote.c(主函数在此.c文件中实现)

    makefile

    /home/vote/comlib:

    include(文件夹)

    lib(文件夹)

    libsrc(文件夹)

    /home/vote/comlib/include:

    comlib.h(头文件)

    /home/vote/comlib/lib:

    暂无()

    /home/vote/comlib/libsrc:

    file.c、tcp.c、debug.c(这三个.c文件实现main函数调用的函数,函数定义在comlib.h中完成)

    makefile

     

    (一)现要编译此工程则需要实现两个makefile,一个是/home/vote/comlib/libsrc下的makefile,用来编译子目录下各文件,其写法如下所示:

    .SUFFIXES:.c HOMEDIR=/home/vote COMDIR=$(HOMEDIR)/comlib INCDIR=-I$(COMDIR)/include CC=gcc CFLAG=-O  EDF= help:         @echo Please input filename that will be made         @echo 'syntax: make <help|all|"filename">' all:file tcp debug .c:         if [ -f $(COMDIR)/lib/libcom.a ]; then ar -x $(COMDIR)/lib/libcom.a; fi           $(CC) -c $< $(CFLAG) $(INCDIR)         ar -rv libcom.a *.o          rm *.o         mv libcom.a $(COMDIR)/lib

     

    各变量及命令的含义:

    .SUFFIXES 指定合法的源文件扩展名,此处是.c文件,即makefile只编译.c文件。

    HOMEDIR为宏,指定当前项目的主目录,其余两个性质相同。

    CFLAG指定编译选项。

    if [ -f $(COMDIR)/lib/libcom.a ]; then ar -x $(COMDIR)/lib/libcom.a; fi         此句是if函数的一种用法,此处含义应该是如果此目录下有libcom.a库文件则将此文件解压缩成.o文件释放到此目录下(经过笔者亲自测试,若此目录下没有libcom.a文件,此命令就会创建一个libcom.a库,但ar -x命令貌似没有创建库的功能,这点最终没能想通,有同学知道其原理的话欢迎指点)。

    $<变量为第一个依赖文件的名称。

    ar -rv libcom.a *.o将.o文件加入到libcom.a中。

     

    编译方法:在makefile目录下输入make all即可自动完成所有子文件编译。

       

    (二)第二个需要编译的文件是/home/vote目录下的vote.c文件,其makefile如下所示:

    .SUFFIXE:.c HOMEDIR=/xilinx/SamShare/APUE/vote COMDIR=$(HOMEDIR)/comlib INCDIRS=-I$(COMDIR)/include LIBDIRS=-L$(COMDIR)/lib   LIB= -lcom  CC=gcc CFLAGS=-O   EDF=    .c:         $(CC) -o $@ $< $(CFLAGS) $(INCDIRS) $(LIBDIRS) $(LIB)    #$@意为完整的目标名称。 ~                                                                

    其各变量及命令与第一个相同,这里不多介绍,需要注意的是此处要链接.../include目录下的comlib.h头文件,以及.../lib下由第一个makefile生成的libcom.a库文件。

     

    编译方法:在makefile目录下输入make vote即可。

    转载请注明原文地址: https://ju.6miu.com/read-6208.html

    最新回复(0)