c - Makefile目标文件生成、变量替换等问题

标签 c makefile compilation object-files

我目前正在尝试为一个 c 大学项目创建一个 Makefile,但是通读教程对我没有太大帮助(另外,makefile 不是评估过程的一部分,我们也没有被教导如何做它)

我的目标是使 makefile 自动化,因此它会自动从 src (src/*.c) 中的 .c 文件创建目标文件,将目标文件放入 bin 文件夹中,并将它们链接到主目录中的可执行文件中.

project/
    bin/
        (object files)
    src/
        (source files)
    executable
    Makefile

到目前为止,我已经大致将这个 makefile 和测试源代码放在一起,但它并没有按照我想要的方式工作,我将在后面解释它是如何工作的:

#compiler used
COMPILER = gcc

#flags for individual object file compilation
FLAGS = -Wall -ansi -g
#RELEASE
# -Wall -ansi -O3
#DEVELOPMENT
# -Wall -ansi -g

#source .c files
SOURCE = $(wildcard src/*.c)
#object files created
OBJECTS = $(SOURCE:.c=.o)
OBJECTS = $(SOURCE: src/=bin/)

#executable name
EXECUTABLE = app

############################################################

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(COMPILER) $(FLAGS) -o $(EXECUTABLE) $(OBJECTS)

%.o: %.c
    $(COMPILER) $(FLAGS) -c %< -o %@

结果是下面的命令:

user@user-lenovo:~/Desktop/C Projects/AED/project$ make
gcc -Wall -ansi -g -o app src/main.c src/test.c

具有讽刺意味的是,它有效,但实际上不应该。这也违背了拥有 makefile 的目的,因为一旦检测到一个更改,所有内容都会重新编译。

首先,我注意到的是 OBJECTS 直接复制了 SOURCE,并没有用 .c 代替 .o,或者用 src/代替 bin/。我试过用“=”代替“:=”,但结果是一样的,我一开始不太明白它们之间的区别。例如,我的想法是将 src/main.c 变成 bin/main.o。

%.o: %.c
    $(COMPILER) $(FLAGS) -c %< -o %@

这部分也是我尝试用单个目标单独生成所有目标文件的失败尝试。我尝试阅读它,但无法弄清楚它们是如何工作的:'%<'、'%@' 或 '%.o' 和 '%.c'

我相信它根本没有运行,因为没有出现目标文件。

我希望你能帮我解决这个问题,提前致谢!

最佳答案

OBJECTS = $(SOURCE:.c=.o)
OBJECTS = $(SOURCE: src/=bin/)

您正在分配给 OBJECTS在那里两次 - 第一个结果被第二个覆盖,但不起作用。你想像这样将它们组合成一个语句

OBJECTS=$(SOURCE:src/%.c=bin/%.o)

你的下一个问题是你需要告诉 make “bin/whatever.o”是从“src/whatever.c”构建的。目前它会在“bin/”中寻找“whatever.c”

因此您构建 .o 文件的方法需要添加目录

bin/%.o: src/%.c
    $(COMPILER) $(FLAGS) -c $< -o $@

你还应该有 $@而不是 %@$<而不是 %<

关于c - Makefile目标文件生成、变量替换等问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52858251/

相关文章:

c++ - 在 C++ 中存储和搜索短语的最佳数据结构

c - 如何阻止我的代码使用 scanf 生成无限循环?

makefile - 无法将目录中的文件复制到其他目录中

Java程序在cmd中执行而不使用设置路径或系统变量

c - 公开或不公开 API

c - 找出当前平台上最大的原生整数类型

ubuntu - 如何使用自动工具构建静态和共享库?

ios - 为 OpenSSL 运行 make 时出现 Clang 错误(iOS、i386、x86_64)

erlang - 如何编译加载到字符串中的erlang代码?

c++ - 从 Windows 命令行运行 C++ 应用程序