在g++中生成文件.可忽略的命令
MakeFile in g++ . Ignorable commands
我正在学习如何在g++中制作Makefile
。我使用以下示例项目代码在这里。这是Makefile
# Makefile for Writing Make Files Example
# *****************************************************
# Variables to control Makefile operation
CXX = g++
CXXFLAGS = -Wall -g
# ****************************************************
# Targets needed to bring the executable up to date
main: main.o Point.o Rectangle.o # ***Statement : 1
$(CXX) $(CXXFLAGS) -o main main.o Point.o Rectangle.o #Commands underneath dependencies have tabs before them
# The main.o target can be written more simply
main.o: Point.h Rectangle.h # ***Statement : 2
$(CXX) $(CXXFLAGS) -c main.cpp
Point.o: Point.h # ***Statement : 3
Rectangle.o: Rectangle.h Point.h # ***Statement : 4
现在我对此有一些问题,为了便于提问,我还引用了使用语句关键字的特定行。
1-我对陈述1的理解正确吗。当g++在main之后遇到main.o(它是targetmain.o的依赖项)时:它跳到targetmain.0(语句2)。然后它检查main的依赖项。如果找到了依赖项(两个头文件),它就会运行命令。然后它回来完成下一个依赖项的任务,以此类推??
2-对于Point.o(即Point.h)的依赖性,为什么没有这样的命令
$(CXX) $(CXXFLAGS) -c Point.cpp
矩形也是如此。o为什么没有针对其依赖性的命令作为
$(CXX)$(CXXFLAGS)-c矩形.cpp
如果有人能澄清这一点,我将不胜感激。
-
正确。值得注意的是,gnu
make
使用修改时间来确定是否满足依赖关系。 -
make
具有用于构建.o
目标的隐式规则。这些使用诸如$CXX
和$CXXFLAGS
之类的变量。对于给定的目标,例如foo.o
,make
将根据源文件foo.<ext>
的存在应用规则,从而创建目标依赖对foo.o : foo.<ext>
。如果扩展是C++扩展(例如.cpp
、.cc
、.C
),则它将沿着的线应用规则$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
您已经为Point.o
指定了额外依赖项。这被添加到隐式依赖Point.cpp
中。如果Point.h
或Point.cpp
的修改时间比Point.o
的修改时间新,则运行该规则。
正如@Basile在评论中指出的那样,您可以使用-p
或--print-data-base
选项调用make
来获取有关make"状态"的信息,包括隐式规则。例如,将它与grep一起使用,我可以查询从C++文件构建.o
文件的隐含规则:
make -p | grep -A 1 -B 1 COMPILE.cc
输出:
# default
COMPILE.cpp = $(COMPILE.cc)
# makefile (from `Makefile', line 1)
--
--
# default
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
# environment
--
--
# default
COMPILE.C = $(COMPILE.cc)
# environment
--
--
# commands to execute (built-in):
$(COMPILE.cc) $(OUTPUT_OPTION) $<
--
--
# commands to execute (built-in):
$(COMPILE.cc) $(OUTPUT_OPTION) $<
关于你扩展的规则,Point.o : Point.h
,这是我的make版本将产生的:
make -p | grep -A 1 -B 1 Point
....
Point.o: Point.cpp Point.h
# Implicit rule search has been done.
....
- clang整洁10忽略了我的NOLINT命令
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何从命令行使用 cmake 为有根的安卓设备制作可执行文件?
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- 从命令提示符使用 MSBuild 调试简单的C++可执行文件
- 应使用 CMake install 命令将可执行资源文件安装到何处?
- 使命令不产生可执行文件
- exe文件不被识别为内部或外部命令,可操作的程序或批处理文件在C++
- 如何从命令行运行可执行文件时启用系统错误消息
- 为什么文件命令声明可执行文件包含"debug_info"
- 具有读写功能的 UNIX 管道系统可执行"ls -la"命令
- 使用 php 将带有命令行可执行文件路径的参数传递
- 通过Linux命令行执行时,可执行文件运行正常 - 调用C System()命令时运行时错误
- 使用系统命令调用可执行文件
- 可执行文件忽略rpath条目
- 是否有一个WinAPI可以从带有可选空格和其他参数的命令行获取文件名
- 在g++中生成文件.可忽略的命令
- 字符串::交换可忽略,因为 std::swap(s1, s2) 就足够了
- C++ 中客户端程序的可选命令行参数