0

当我练习时,我有一个练习路径。

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

还有一个名为symbol_try.I 的代码路径,我总是在其中添加新文件夹(其中包含 ac 文件和 main 函数)symbol_try并编译它。

每次我必须在终端中通过 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   

在 myInclude/Rule.mk

FOBJS+=myInclude/otherFunction.o myInclude/error.o \
       myInclude/unit.o myInclude/unitTest.o\

在 symbol_try/codeList_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

在 symbol_try/codeList_13.1/Makefile 中:

codeList_13.1.o:codeList_13.1.c
    gcc -c codeList_13.1.c

好吧,那可以工作。但正如您所见,我必须为每个文件夹编写一个 Rule.mk(初始化 FOBJS)和一个 Makefile。

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

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

谢谢你的帮助。

4

3 回答 3

1

这是一种只用一个 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

  1. 添加标题的包含路径。您可能对目录中的各个目标文件有一些标题myInclude
  2. 将编译器标志放在这里。
  3. 添加要构建的源文件的路径。
  4. 列出可执行文件所依赖的目标文件
  5. 由于没有调用文件,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
于 2013-08-08T19:43:00.190 回答
0

为什么不从 myInclude 中的对象创建一个库并在代码路径 (symbol_try/codeList_13.1) 中的 Makefile 中进行链接。无论如何,后者更好,因为所需的库(-pthread -lpthread在您的情况下)可能会因其他一些代码而改变。现在主 Makefile 将无事可做,只需在所有需要的子目录中调用 make。

于 2013-08-08T16:36:28.347 回答
0

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

    SOURCES=sample.c sampletest.c

    OBJECTS=$(SOURCES:%.c=$(OBJDIR)/%.o)

    all: $(OBJECTS)

    $(OBJDIR)/%.o: %.c
        $(CC) $(CFLAGS) -o $@ $<

在项目的根目录中,创建一个带有规则的 makefile 来编译每个子文件夹,如下所示。

    Dirs= path-to-rootdir
    objs:
    set -e ; \
    for i in $(Dirs) ; do \
      $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS_MODULE)" LDFLAGS="$(LDFLAGS)"  OBJDIR="$(OBJDIR)" -C $$i; \
done

然后您可以使用它通过添加规则来构建可执行文件

   EXE: objs
    $(CC)  -L./Path1 $(LIB_PATH)  -llib1  -o $(EXE_NAME) $(wildcard $(OBJDIR)/*.o) 

希望这可以帮助!!!

于 2013-08-08T20:06:43.810 回答