- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 makefile 中的 % 不起作用。
我已经在 ubuntu 16.04 x64 上测试了 makefile。
我的 makefile 代码是:版本 1
CC=gcc
OBJ=main.o
TARGET:=main
.PHONY: clean
all : main
# ${OBJ}:%.o:%.c
%.i : %.c
$(info Preprocess: build main.i)
${CC} -E -o $@ $<
%.s : %.i
$(info Compile: build main.s)
${CC} -S -o $@ $<
%.o : %.s
$(info Assemble: build main.o)
${CC} -c -o $@ $<
main : main.o
$(info Link: build main.o)
${CC} -o $@ $^
clean:
rm -f *.o *.out *.s *.i *.asm *.map ${OBJ} main
运行make,终端打印信息:
gcc -c -o main.o main.c
Link: build main.o
gcc -o main main.o
所以只有最后一条规则(main: main.o) 运行。第一步是自动生成代码 (gcc -c -o main.o main.c)。为什么其他规则没有运行?
然后我修改第三条规则,添加静态模式:版本 2
...
%.i : %.c
$(info Preprocess: build main.i)
${CC} -E -o $@ $<
%.s : %.i
$(info Compile: build main.s)
${CC} -S -o $@ $<
main.o : %.o : %.s
$(info Assemble: build main.o)
${CC} -c -o $@ $<
%: %.o
$(info Link: build main.o)
${CC} -o $@ $^
然后所有规则生效,显示信息:
Preprocess: build main.i
gcc -E -o main.i main.c
Compile: build main.s
gcc -S -o main.s main.i
Assemble: build main.o
gcc -c -o main.o main.s
Link: build main.o
gcc -o main main.o
rm main.i
(为什么运行“rm main.i”?)
我再次修改makefile:版本 3
%.o:%.c
$(info build main.o)
${CC} -c -o $@ $<
main : main.o
$(info Link: build main.o)
${CC} -o $@ $^
可以正常运行。打印消息:
build main.o
gcc -c -o main.o main.c
Link: build main.o
gcc -o main main.o
那么,为什么版本1不能正常工作呢?
最佳答案
它不起作用,因为 make
知道如何从 .c
源构建目标文件 (.o
),是一个built-in implicit rule
您可以禁用隐式规则,如果您使用 make -r
运行您的版本 1,它应该按预期运行。
.i
文件被删除,因为它是一个中间文件,默认情况下 make
删除所有中间文件,您可以通过使用 .PRECIOUS 来避免这种情况:一些-文件名
%
makefile 中的规则被称为stem,pattern 规则(不是通配符,它们是另一回事)
您可以使用参数 --debug
或 --debug=all
运行 make
以获得详细日志或更详细的日志
编辑
您还有两个选项可以禁用内置规则并让版本 1 正常工作:
%.o: %.c
.SUFFIXES:
If you modify the suffix list, the only predefined suffix rules in effect will be those named by one or two of the suffixes that are on the list you specify
编辑
禁用我过去使用的内置规则的附加选项:
MAKEFLAGS += --no-builtin-rules
关于c - Makefile:为什么带有 % 的 makefile 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56164355/
我有一个 Makefile,它针对特定目标调用另一个 Makefile。假设主 Makefile 包含 some_dir/some_target: cd some_dir && make so
这两个文件大多出现在开源项目中。 它们的用途是什么?它们如何工作? 最佳答案 Makefile.am 是程序员定义的文件,由 automake 使用来生成 Makefile.in 文件( .am 代表
我的源代码位于一堆子目录中,例如: src/widgets/apple.cpp src/widgets/knob.cpp src/tests/blend.cpp src/ui/flash.cpp 在项
这就是我所拥有的: SUBDIRS = src/lib/ResourceManager all: $(SUBDIRS) $(SUBDIRS): make install -C $@ 我正在尝试
我想写一个 Makefile 来执行来自两个不同数组的两个输入的命令例如 a = A B C b = 1 2 3 ./run A 1 ./run B 2 ./run C 3 我不知道怎么写,因为在Ma
在 GNU make 手册的早期部分之一,Section 3.7 , 有一个 makefile 配方的大纲 immediate : immediate ; deferred defer
是否存在将 gmake 的 GNU Makefile 转换为可用于 make (FreeBSD-make) 的 Makefile 的实用程序? 最佳答案 该实用程序称为开发人员(程序员,制作大师,..
所以我前段时间了解了什么是 Makefile,创建了一个模板 Makefile,我所做的就是为我正在执行的每个程序复制和更改相同的文件。我改了几次,但它仍然是一个非常粗糙的Makefile。我应该如何
我正在做一些 Makefile 重构,并试图找出最简洁的方法来实现一个 Makefile,它执行以下操作: 有一个变量列出了所有源文件(可以是 C 和 C++ 文件) 所有目标文件都在 OBJ_DIR
我正在尝试创建一个 Makefile,它将通过 tic 编译位于目录中的 terminfo 文件。 tic 还将它自动创建的 termcap 文件复制到系统或用户特定的目标文件夹。对于普通用户,如果
我想要类似的东西 BROKEN_THINGS = \ thing1 \ # thing1 is completely broken thing2 \ # thing2 is broken to
如果我的程序必须为不同的结果(主要是错误)返回不同的值(例如 0、1、2、3 等),则调用该程序的 makefile 将不得不停止执行其余的 makefile 命令。即使该命令产生错误(返回非零值),
我正在学习使用漂亮的 Linux 工具:make。还有一点我想了解的: 让我们看一下这个简单的例子: JADE = $(shell find pages/*.jade) HTML = $(JADE:.
假设您有一个包含两个伪目标“all”和“debug”的 Makefile。 'debug' 目标旨在构建与 'all' 相同的项目,除了一些不同的编译开关(例如 -ggdb)。由于目标使用不同的编译开
我有一个调用多个其他生成文件的生成文件。 我想将 -j 参数传递给其他 makefile 调用。 类似(make -j8): all: make -f libpng_linux.mk -j
我处理过的 Makefile 大部分都很复杂,并且隐藏了很多关系。我自己从来没有写过一个,想知道是否有人有一些关于编写易于阅读和可重用的 Makefile 的提示? 最佳答案 我通常使用这样的东西,在
嘿,我有一个简单的“主” Makefile,它只是调用其他 makefile。我正在尝试执行以下操作,以便以正确的顺序构建组件: LIB_A = folder_a LIB_B = folder_b L
生成文件: #there is a whitespace after "/my/path/to" FOO = "/my/path/to" BAR = "dir" INCLUDE_DIRS = $(FO
我正在学习 makefile,我知道如何创建一个简单的 makefile。我正在继续使用嵌套的 makefile。这是我的目录结构 /src ...makefile ...main.cpp ...fo
什么TEMP0_FILES下面计算到? SOURCE_FILES可以等于多个源文件。请告诉我以下语法 :.cpp=.o 的用途 SOURCE_FILES = main.cpp TEMP0_FILES
我是一名优秀的程序员,十分优秀!