C 如何编写更简洁的Makefile(带有子Makfile)

C 如何编写更简洁的Makefile(带有子Makfile),c,makefile,C,Makefile,当我练习的时候,我有一条练习的道路 在这个路径下,我有一个名为myInclude的Include路径(我有一些有用的功能,就是这个文件夹,我总是使用它。) 还有一个名为symbol\u-try的代码路径。我总是在symbol\u-try中添加新文件夹(其中包含一个c文件和主函数)并编译它 每次我都要用gcc在终端上编译它。这是一项枯燥的工作,所以我写了一个Makefile 以下是一个例子: 实践中的主要Makefile路径: FOBJS= include myInclude/Rule.mk in

当我练习的时候,我有一条练习的道路

在这个路径下,我有一个名为
myInclude
的Include路径(我有一些有用的功能,就是这个文件夹,我总是使用它。)

还有一个名为
symbol\u-try
的代码路径。我总是在
symbol\u-try
中添加新文件夹(其中包含一个c文件和主函数)并编译它

每次我都要用gcc在终端上编译它。这是一项枯燥的工作,所以我写了一个Makefile

以下是一个例子:

实践中的主要Makefile路径:

FOBJS=
include myInclude/Rule.mk
include symbol_try/codeList_13.1/Rule.mk
symbol:$(FOBJS)                   <==What exactly I what . A executable file.
    gcc -o symbol $(FOBJS) -pthread -lpthread

subsystem:
    cd myInclude/ && $(MAKE)
    cd symbol_try/codeList_13.1/ &&$(MAKE)
clean:
    rm -rf symbol   
在符号\u try/code列表\u 13.1/Rule.mk中

FOBJS+=symbol_try/codeList_13.1/codeList_13.1.o
在myInclude/Makefile中:

    OBJS=otherFunction.o error.o unit.o unitTest.o
    ALL:$(OBJS)
    .PHONY:ALL
    $(OBJS):%.o:%.c
        gcc -c $< -o $@

    clean :
        otherFunction.o error.o unit.o
codeList_13.1.o:codeList_13.1.c
    gcc -c codeList_13.1.c
CC        = gcc
CPPFLAGS += -I myInclude/                             (1)
CFLAGS   += -std=c99 -Wall                            (2)
VPATH     = myInclude/ \                              (3)
            symbol_try/codeList_13.1/

symbol: otherFunction.o error.o unit.o unitTest.o codeList_13.1.o  (4)
    $(CC) -o $@ $^                                    (5)

.PHONY : clean
clean:
    rm -f symbol *.o
嗯,那可以。但是正如您所看到的,我必须为每个文件夹编写一个Rule.mk(初始化FOBJ)和一个Makefile

我是make新手,我想找到一种更简洁的方法,我只需要为每个文件夹编写一个Makefile和一个主Makefile

PS:我总是更改myInclude中的代码,所以我不想将其构建为库


谢谢您的帮助。

为什么不从myInclude中的对象创建一个库,并在代码路径(symbol\u try/codeList\u 13.1)的Makefile中进行链接呢。无论如何,后者更好,因为对于某些其他代码,所需的库(
-pthread-lpthread
)也可能会更改。
现在,主Makefile除了在所有需要的子目录中调用make之外,将无事可做。

这里有一种方法,您可以只使用一个Makefile:

CC        = gcc
CPPFLAGS += -I myInclude/                             (1)
CFLAGS   += -std=c99 -Wall                            (2)
VPATH     = myInclude/ \                              (3)
            symbol_try/codeList_13.1/

symbol: otherFunction.o error.o unit.o unitTest.o codeList_13.1.o  (4)
    $(CC) -o $@ $^                                    (5)

.PHONY : clean
clean:
    rm -f symbol *.o
请注意,
make
知道如何构建C文件,并且有一些标准宏:CC、CPPFLGAS、CFLAGS

  • 添加标题的包含路径。您可能在
    myInclude
    目录中有一些单独对象文件的标题
  • 将编译器标志放在这里
  • 将路径添加到要生成的源文件
  • 列出可执行文件所依赖的对象文件
  • 由于没有名为
    symbol.c
    的文件,您需要告诉make如何使用规则创建
    symbol.o
    $@
    表示目标(“符号”),而
    $^
    表示所有先决条件(列出的对象文件)
  • 以下是我的测试目录中所有文件的列表:

    $ find . -type f
    .
    ./Makefile
    ./myInclude/error.c
    ./myInclude/header.h
    ./myInclude/otherFunction.c
    ./myInclude/unit.c
    ./myInclude/unitTest.c
    ./symbol_try/codeList_13.1/codeList_13.1.c
    
    以及构建输出:

    $ make
    gcc -std=c99 -Wall -I myInclude/  -c -o otherFunction.o myInclude/otherFunction.c
    gcc -std=c99 -Wall -I myInclude/  -c -o error.o myInclude/error.c
    gcc -std=c99 -Wall -I myInclude/  -c -o unit.o myInclude/unit.c
    gcc -std=c99 -Wall -I myInclude/  -c -o unitTest.o myInclude/unitTest.c
    gcc -std=c99 -Wall -I myInclude/  -c -o codeList_13.1.o symbol_try/codeList_13.1/codeList_13.1.c
    gcc -o symbol otherFunction.o error.o unit.o unitTest.o codeList_13.1.o
    

    在每个文件夹中都有一个带有

        SOURCES=sample.c sampletest.c
    
        OBJECTS=$(SOURCES:%.c=$(OBJDIR)/%.o)
    
        all: $(OBJECTS)
    
        $(OBJDIR)/%.o: %.c
            $(CC) $(CFLAGS) -o $@ $<
    
    然后您可以使用它通过添加规则来构建可执行文件

       EXE: objs
        $(CC)  -L./Path1 $(LIB_PATH)  -llib1  -o $(EXE_NAME) $(wildcard $(OBJDIR)/*.o) 
    
    希望这有帮助

    在添加CFLAGS+=-std=c99-Wall之后,出现了一些问题。一些struct和marco不起作用。我删除了那行,一切正常,为什么会发生这种情况?如果你愿意,你可以同时删除这两行(即只需
    CFLAGS+=
    )。但是
    -Wall
    最好用来检查代码中的错误
    -Wall
    打开正常的gcc警告,如果代码不正确,可能会导致大量消息。
    -std=c99
    决定编译器将使用哪种风格的C。还有其他设置,请参见
       EXE: objs
        $(CC)  -L./Path1 $(LIB_PATH)  -llib1  -o $(EXE_NAME) $(wildcard $(OBJDIR)/*.o)