makefile 符号 $@ 和 $< 有何作用?意思是?
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
$@
和 $<
到底是做什么的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
$@
是正在生成的目标的名称,$<
是第一个先决条件(通常是源文件)。您可以在 GNU制作手册。例如,考虑以下声明:
在本例中:
$@
计算结果为all
$<
计算结果为library.cpp< /code>
$^
计算结果为library.cpp main.cpp
$@
is the name of the target being generated, and$<
the first prerequisite (usually a source file). You can find a list of all these special variables in the GNU Make manual.For example, consider the following declaration:
In this case:
$@
evaluates toall
$<
evaluates tolibrary.cpp
$^
evaluates tolibrary.cpp main.cpp
来自 使用 GNU Make 管理项目,第三版,第 14 页16(它遵循 GNU 自由文档许可证):
From Managing Projects with GNU Make, 3rd Edition, p. 16 (it's under GNU Free Documentation License):
$@
和$<
称为自动变量。变量$@
表示目标的名称,$<
表示创建输出文件所需的第一个先决条件。例如:
这里,
hello.o
是输出文件。这就是$@
扩展的内容。第一个依赖项是hello.c
。这就是$<
扩展的结果。-c
标志生成.o
文件;请参阅man gcc
了解更详细的解释。-o
指定要创建的输出文件。有关更多详细信息,您可以阅读这篇有关 linicide 的 Linux Makefile 的文章。
另外,您可以检查 GNU
make
手册。它将使制作 Makefile 和调试它们变得更容易。如果运行此命令,它将输出 makefile 数据库:
The
$@
and$<
are called automatic variables. The variable$@
represents the name of the target and$<
represents the first prerequisite required to create the output file.For example:
Here,
hello.o
is the output file. This is what$@
expands to. The first dependency ishello.c
. That's what$<
expands to.The
-c
flag generates the.o
file; seeman gcc
for a more detailed explanation. The-o
specifies the output file to create.For further details, you can read this article on linoxide about Linux Makefiles.
Also, you can check the GNU
make
manuals. It will make it easier to make Makefiles and to debug them.If you run this command, it will output the makefile database:
$@
和$<
是特殊宏。其中:
$@
是目标的文件名。$<
是第一个依赖项的名称。The
$@
and$<
are special macros.Where:
$@
is the file name of the target.$<
is the name of the first dependency.如果
main.cpp
、hello.cpp
、factorial.cpp
中的任何一个发生更改,Makefile 将构建hello
可执行文件。实现该规范的最小 Makefile 可能是:为了改进上述内容,我们只编译那些已编辑过的 C++ 文件。然后,我们将生成的目标文件链接在一起。
为了改进这一点,我们可以用单个
.cpp.o
规则替换所有对象文件规则:这里的
.cpp.o
规则定义了如何从anyfile.cpp
构建anyfile.o
。$<
匹配第一个依赖项,在本例中为anyfile.cpp
$@
与目标匹配,在本例中为anyfile .o
。Makefile 中的其他更改包括:
The Makefile builds the
hello
executable if any one ofmain.cpp
,hello.cpp
,factorial.cpp
changed. The smallest possible Makefile to achieve that specification could have been:To improve on the above, we only compile those C++ files that were edited. Then, we just link the resultant object files together.
To improve on this, we can replace all object file rules with a single
.cpp.o
rule:Here the
.cpp.o
rule defines how to buildanyfile.o
fromanyfile.cpp
.$<
matches to first dependency, in this case,anyfile.cpp
$@
matches the target, in this case,anyfile.o
.The other changes present in the Makefile are:
例如,如果您想编译源代码但在不同的目录中有对象:
您需要执行以下操作:
但对于大多数宏,结果将是所有对象后跟所有源,例如:
所以这不会编译任何内容^^,您将无法将对象文件放在不同的目录中:(
解决方案是使用这些特殊宏,
这将为 SRC (src/file.c) 中的每个 .c 文件生成一个 .o 文件 (obj/file.o)
这意味着:
但是逐行代替 OBJ 的所有行,后面跟着 SRC 的所有行
in exemple if you want to compile sources but have objects in an different directory :
You need to do :
but with most of macros the result will be all objects followed by all sources, like :
so this will not compile anything ^^ and you will not be able to put your objects files in a different dir :(
the solution is to use these special macros
this will generate a .o file (obj/file.o) for each .c file in SRC (src/file.c)
it means :
but lines by lines INSTEAD of all lines of OBJ followed by all lines of SRC