创建包含不同测试的 makefile

标签 c makefile

我想知道我是否正确创建了 Makefile。我有以下文件:

Student.h Student.C University.h University.c list.h IDCard.h IDCard.c union.h

我还有一个库 mylib,我使用了 list.hunion.h
此外,我有以下层次结构:

- University
    - Student
        - list
        - IDCard
    - union

这意味着 University import Student and union and Student import listIDCard

我需要遵循的步骤:

  1. 使用 make 命令创建 testing1.exe - 没有断言的 Release模式。此文件是给定 testing1.c 的可运行文件。

  2. 使用 make testing2.exe 创建 test2.exe - 没有断言的 Release模式。此文件是testing2.c的可运行文件。

  3. 使用 make testing2_debug.exe 创建 testing2_debug.exe - Debug模式,带断言。此文件是test2.c的可运行文件。

  4. 使用 make test 创建 test.exe - 没有断言的 Release模式。此文件可由 test.c 运行。

  5. 使用 make clean 进行清理,以便重建成功。

我写的 Makefile 是这样的:

CC = gcc
OBJS = IDCard.o Student.o University.o
DEBUG_OBJS = IDCard_debug.o Student_debug.o University_debug.o
SOURCE = IDCard.c Student.c University.c
HEADER = IDCard.h Student.h University.h list.h union.h
CFLAGS = -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG -L. -mylib
EXEC = testing.exe testing1.exe testing2.exe testing2_debug.exe
testing_O = testing1.o testing2.o testing2_debug.o testing.o

#make testing1.exe
testing1.exe : $(OBJS) $*.o
    $(CC) -o $@ -DNDEBUG $(OBJS) -L. mylib

#make testing2.exe
testing2.exe : $(OBJS) $*.o
    $(CC) -o $@ -DNDEBUG $(OBJS) -L. mylib

#testing2_debug.exe
testing2_debug.exe : $(DEBUG_OBJS) $*.o
    $(CC) -o $@ -DNDEBUG $(OBJS) -L. mylib

#make testing.exe
testing.exe : $(OBJS) $*.o
    $(CC) -o $@ -DNDEBUG $(OBJS) -L. mylib

testing1.o : testing1.c Student.h University.h
    $(CC) -c -DNDEBUG $(CFLAGS) $*.c
Student.o : list.h IDCard.h Student.c Student.h
    $(CC) -c -DNDEBUG $(CFLAGS) $*.c
University.o :  union.h University.c University.h
    $(CC) -c -DNDEBUG $(CFLAGS) $*.c
IDCard.o : IDCard.h
    $(CC) -c -DNDEBUG $(CFLAGS) $*.c

testing2_debug.o : testing2.c Student.h University.h
    $(CC) -c -g $(CFLAGS) $*.c -o $@
Student_debug.o : list.h IDCard.h Student.c Student.h
    $(CC) -c -g $(CFLAGS) $*.c -o $@
University_debug.o : union.h University.c University.h
    $(CC) -c -g $(CFLAGS) $*.c -o $@
IDCard_debug.o : IDCard.h
    $(CC) -c -g $(CFLAGS) $*.c -o $@

clean :
    rm -f $(OBJS) $(DEBUG_OBJS) $(EXEC) $(testing_O)

我对创建 Makefile 有点陌生,所以我尽量少犯错误。我的 Makefile 是否满足我的需要?可以简化吗?它是否遵循约定?

最佳答案

$*.o不应该是一种依赖。 $(OBJS)已经涵盖了这一点。

作为一般规则,您可以避免针对单个目标文件的目标。

这是一个可能需要修改以满足您的需要的示例目标:

%.o: %.c %.h
<tab>$(CC) -DNDEBUG -c $(CFLAGS) -o $@ $<

%_debug.o: %.c %.h
<tab>$(CC) -c -g $(CFLAGS) -o $@ $< 

这要求头文件与源文件具有相同的基本名称。

另一个可行的方法是列出每个目标文件的头文件依赖关系,然后进行匹配:

testing1.o: Student.h University.h
Student.o: list.h IDCard.h Student.h
University.o: union.h University.h
IDCard.o: IDCard.h
testing2_debug.o: Student.h University.h
Student_debug.o: list.h IDCard.h Student.h
University_debug.o: union.h University.h
IDCard_debug.o: IDCard.h

%.o: %.c
<tab>$(CC) -DNDEBUG -c $(CFLAGS) -o $@ $<

%_debug.o: %.c
<tab>$(CC) -c -g $(CFLAGS) -o $@ $< 

对于 .exe 可以遵循类似的规则文件:

%.exe: $(OBJS)
<tab>$(CC) -DNDEBUG $(CFLAGS) $^ -o $@ -L. -lmylib

%_debug.exe: $(DEBUG_OBJS)
<tab>$(CC) -g $(CFLAGS) $^ -o $@ -L. -lmylib

另外,确保替换 <tab>在这些示例中,您的 Makefile 带有硬标签才能有效。

关于创建包含不同测试的 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57747450/

相关文章:

c - 静态值存储在程序集中的什么位置

c - 为什么某些声明为 extern 的函数和头文件未包含在 Git 源代码的源代码中?

c - 有没有办法遍历多个结构,比如通过一个数组?

c - 构建 C 代码的技巧/资源?

c++ - gcc 自动依赖完整路径

c++ - Makefile 结合了 fltk 和 C++ 文件

c++ - 为什么 1 不大于 -0x80000000

c - c中普通指针和const指针的区别

c - 使 : "The system cannot find the path specified" only when compiling with makefile?

c++ - 写一个makefile把一个.h .hpp和.cpp一起编译成可执行文件