c - 这个 Makefile 正确吗?

标签 c makefile

我被要求做一个 makefile,我已经这样做了:

# La siguiente no es necesariamente requerida, se agrega para
# mostrar como funciona.

.SUFFIXES: .o .c
.c.o:
    $(CC) -c $(CFLAGS) $<


# Macros

CC = g++
CFLAGS = -Wall -Wextra -Werror -pedantic
SRC = main.c metbasicos.c metbasicos.h metintermedios.c metintermedios.h metavanzados.c metavanzados.h
OBJ = main.c metbasicos.c metintermedios.c metavanzados.c


# Reglas explicitas

all: $(OBJ)
    $(CC) $(CFLAGS) -o p1 $(OBJ)

clean:
    $(RM) $(OBJ) main

# Reglas implicitas

metbasicos.o: metbasicos.c metbasicos.h
metintermedios.o: metintermedios.c metintermedios.h
metavanzados.o: metavanzados.c metavanzados.h
main.o: main.c metbasicos.h metintermedios.h metavanzados.h

是否正确?

编译我通常使用以下命令:

g++ -Wall -Wextra -Werror -pedantic main.c metbasicos.c metintermedios.c metavanzados.c -o p1.exe

如果我做一些测试:

make ./p1 < input.txt

工作正常,但我不确定它是否是正确的实现。

如果我犯了一些严重的错误,有人可以告诉我吗?

非常感谢。

最佳答案

这里没有任何严重的错误,但是有一些奇怪的事情。正如 Ignacio 指出的那样,如果您不想,您真的不需要重新定义编译规则。但您可能确实这样做的原因是您有点混淆了 C 和 C++。

您正在构建 .c 文件,按照惯例,这些文件是 C 代码,而 g++ 是一个 C++ 编译器,这很奇怪。如果你真的在构建 C 代码,你应该用 gcc 编译它。如果你真的在构建 C++ 代码,你应该重命名你的文件,以 .cpp.cc 或类似的结尾。此外,C++ 编译器的 GNU make 变量是 CXX,而不是 CC,标志变量是 CXXFLAGS 而不是 CFLAGS

此外,您的all 目标应该依赖于p1 并且p1 目标应该包含链接:

.PHONY: all
all: p1
p1: $(OBJ)
        $(CC) $(CFLAGS) -o p1 $(OBJ)

否则 p1 将在您每次运行 make 时重新链接,即使未进行任何更改也是如此。

您还可以添加其他更高级的东西,例如自动构建头文件先决条件等。

关于c - 这个 Makefile 正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19497715/

相关文章:

python - 构建 CPython 时禁用编译器优化

command-line - 如何通过命令行在 Makefile 中取消定义变量

c - 使用一个 Makefile 从不同的文件生成不同的可执行文件

c - 将 UDP 数据包发送到死服务器

c - 在同一个函数中,通过间接访问访问不在范围内的局部变量是否是 UB?

c - 在枚举声明中使用数据类型

c++ - 编译共享库时解析 ifdefs

ios - stdargs [va_start()、va_arg() 等] 在 arm64 上损坏了吗?

命令行参数问题

c - 使用子目录中的程序集目标文件