Joh*_*ohn 1 c makefile gnu-make
我编写了简单的代码*make_test*来测试makefile的功能.文件夹结构如下:
include文件夹包含maths.h
float add(float a, float b)
{
return a+b;
}
Run Code Online (Sandbox Code Playgroud)主文件包含以下代码:
# include <stdio.h>
# include <include/maths.h>
int main(int argc, char** argv)
{
float a=1;
float b=4;
printf("%f + %f = %f\n", a, b, add(a, b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)makefile包含以下内容:
IDIR = -I.
DEPS = ./include/maths.h
CC= gcc -Wall -g $(IDIR)
program: make_test.o
%.o: test/%.c $(DEPS)
@echo "Rule 1 was called"
$(CC) -o $@ $<
%.o: test/%.c $(DEPS)
@echo "Rule 2 was called"
$(CC) -o $@ $<
%.o: test/%.c $(DEPS)
@echo "Rule 3 was called"
$(CC) -o $@ $<
Run Code Online (Sandbox Code Playgroud)请注意,有一些test /%.c语句是故意插入进行测试的.没有测试文件夹.如果我在主文件中进行更改并在命令行上输入make,我会得到
gcc -Wall -g -I. -c -o make_test.o make_test.c
Run Code Online (Sandbox Code Playgroud)
我的问题是我没有在任何地方添加-c标志然后为什么它出现在输出?不应该有"无所事事"输出,因为不存在依赖(test /%.c)或更改(include/maths.h)?
谢谢,
Make包含大量内置规则.您可以通过运行以下内容来查看它们:make -p -f /dev/null.其中一条规则用于编译代码,它包含-c标志.
为什么要使用内置规则?因为您定义的规则不匹配.他们告诉如何.o从子目录中的.c文件构建文件test.但是该make_test.c文件不在test子目录中,因此make不能使用这些规则.这样做看起来在其内置的规则,以找到能够建立一个规则,.o从.c这个相同的目录中,发现一个,并使用该.
如果将make_test.c文件移动到test子目录中,则将使用您的规则.
但请注意,make在这里是正确的:-c如果需要.o输出,必须将标志添加到编译器调用中.你的规则不会创建一个目标文件,他们会创建一个exectuable命名xxx.o,这是非常令人困惑的.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |