【问题标题】:Implicit Patter use of Unix makefile for compiling C++隐式模式使用 Unix makefile 编译 C++
【发布时间】:2020-09-19 11:45:52
【问题描述】:

您好,我正在尝试学习如何使用 gnu makefile 并尝试在此 makefile 中使用隐式模式来编译我的 C++ 脚本:

CXX=g++

init : init.o
    $(CXX) -o $@ $<

init.o : init.cpp
    $(CXX) -c $<

这个make init 的输出是:init.o(目标文件)和init(可执行文件)。

然后我尝试添加模式规则:

CXX=g++

% : %.o
    $(CXX) -o $@ $<

%.o : %.cpp
    $(CXX) -c $<

但是这个makefile只输出init(可执行)文件,为什么我错过了什么?

【问题讨论】:

    标签: c++ makefile gnu-make


    【解决方案1】:

    你真的应该剪切和粘贴(请不要截图)你输入的命令和你在寻求帮助时得到的输出,如果不是很明显,解释错误的输出部分。

    我怀疑如果您查看 make 的输出,您会发现它正在运行 rm init.o,这就解释了为什么 .o 文件不存在。

    这是由于 GNU make 的 intermediate file 删除功能。因为 .o 在你的 makefile 中没有被引用到其他任何地方,所以 make 决定它并不是正确运行所需要的并删除它。

    第一个问题是,这对你来说真的是个问题吗?您需要保留.o 文件吗?干什么用的?

    第二件事是您不需要自己定义这些模式规则。 GNU make 具有内置规则,知道如何从具有相同前缀名称的源文件创建可执行文件。

    您的整个 makefile 可能只是:

    CXX = g++
    

    【讨论】:

    • 附带说明,默认的“CXX”是 g++。空的makefile,或者只指定默认目标:“default:init”将完成这项工作。
    • 这在 Linux 上可能是正确的,但并非在所有系统上都是正确的;如果你真的想要它,最好是明确的。无论如何,你甚至不需要一个空的makefile:如果你想要的话,你可以完全删除makefile :)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2018-09-04
    • 2020-11-08
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多