如何创建仅包含主文件和模板头 (C++) 的 makefile

Posted

技术标签:

【中文标题】如何创建仅包含主文件和模板头 (C++) 的 makefile【英文标题】:How do I create a makefile with only a main file and template header (C++) 【发布时间】:2015-02-22 19:48:08 【问题描述】:

我正在尝试创建一个将编译两个文件的 makefile: -main.cpp -队列.h 在头文件中,我有一个模板 Queue 类的完整实现。主文件包括头文件。

我可以在终端(在 Mac 上)通过输入以下代码来测试此代码:

g++ -c main.cpp
g++ -o queue main.o

我可以毫无问题地运行程序 (./queue)。

现在对于这个项目,它需要通过在终端中输入“make”来编译。 对于以前的项目,我使用了这样的东西:

all: sDeque

sDeque: sDeque.o sDeque_main.o
    g++ -o sDeque sDeque.o sDeque_main.o

sDeque.o: sDeque.cpp sDeque.h
    g++ -c sDeque.cpp

sDeque_main.o: sDeque_main.cpp sDeque.h
    g++ -c sDeque_main.cpp
clean:
    rm sDeque sDeque.o sDeque_main.o

但是上面的例子有一个 main.cpp、sDeque.cpp 和 sDeque.h。这很有效,因为我可以创建目标文件,但我认为我不能仅从头文件创建目标文件。

对于手头的任务,我只有主文件和头文件(因为它是一个模板类)。 我如何为此制作makefile?

【问题讨论】:

为什么要编写自己的 Makefile?为什么不使用 cmake 或 qmake 之类的工具来为大量不同平台生成 Makefile? 我需要包含项目的makefile,教授将使用他自己的main来测试我的模板类,并且需要为他准备一个通用的makefile。 您仍然可以使用 cmake/qmake 生成 Makefile 以与您的项目一起发布。无论如何,随着项目的增长,编写和管理 cmake/qmake 文件会容易得多。 实际上,如果文件中有有效的实现,您可以从头文件创建目标文件,但将实现放在头文件中通常不是一个好习惯。话虽如此,如果教授要使用他自己的 main.cpp 并且您提供了一个标头,您可以简单地制作一系列目标来制作“main”,包括标头、main.o 和 main .cpp 文件,他应该能够使用,只需在帖子中扩展您的示例即可。 @GusGus 我实际上不同意肯尼的观点。如果您刚刚开始,那么您应该了解 make 的基础知识。我建议前往mindview.net/Books/TICPP/ThinkingInCPP2e.html 并阅读第 1 卷第 3 章的结尾。这是一个很好的介绍,您可以免费下载。 【参考方案1】:
# All the targets
all: queue

# Dependencies and rule to make queue
queue: main.o
    g++ -o queue main.o

# Dependencies and rule to make main.o
main.o: main.cpp queue.h
    g++ -c main.cpp

clean:
    rm queue main.o

【讨论】:

这完美!太感谢了。我希望我可以投票,但我猜我还没有足够的代表? @GusGus,不用担心。当你有时间的时候,你应该认识GNU make manual。它有很多花招。【参考方案2】:

R Sahu 的回答是正确的,但请注意,您可以利用 GNU make 的内置规则做得更好(减少打字),这些规则已经知道如何做这些事情。

特别是,如果您将main.cpp 文件重命名为queue.cpp(使其与您要生成的程序具有相同的前缀queue),您的整个makefile 可以只包含:

CXX = g++

all: queue
queue.o: queue.h

clean:
        rm queue queue.o

【讨论】:

在 MSYS 下的 Windows 上除外,其中隐式规则需要 永远 并且您最好 (a) 使用 -r 禁用它们和 (b) 编写您需要的规则你自己,就像在另一个答案中一样。 即使在 Windows 上,这个简单的 makefile 也不会太慢。如果它变得更加复杂,那么是的,您可能需要对不需要的内置规则做一些事情。

以上是关于如何创建仅包含主文件和模板头 (C++) 的 makefile的主要内容,如果未能解决你的问题,请参考以下文章

如何隐藏 C++ 头文件中的函数

C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

C++ 头文件约定

如何使用自动工具安装仅头文件的 C++ 库?

C++中使用Thread类需要包含啥头文件

基本 C++ 头文件问题