C++ Makefile头文件和cpp

6
我正在尝试创建一个Makefile,但是遇到了很大的困难。我有三个文件:main.cpp、garage.cpp和garage.hpp。下面的命令可以工作,但是我不知道如何将其转换为Makefile。非常感谢您的帮助。-std=c++0x很重要,因为如果我去掉它并用其他东西替换它,它就无法编译。再次感谢。
g++ -std=c++0x -Wall -o main main.cpp garage.hpp garage.cpp

RTFM,https://www.gnu.org/software/make/manual/make.html。 - Stargateur
3个回答

10

注意,将头文件(garage.hpp)添加到编译/链接行中是不正确的。只有源文件(.cpp)应该放在编译行上。

@gowrath的解决方案易于理解,但与您的命令行解决方案完全相同:它没有利用make的任何功能。编写一个shell脚本或别名来执行此操作比使用makefile更容易。

@Rahul的解决方案拼写出所有细节,但没有利用make允许您在编写makefile时减少键入或努力的任何特性。

实际上,Make具有大量内置规则。为了定制它们,您只需设置标准变量的值,make就会完成其余的工作。您可以编写以下makefile:

CXX = g++
CXXFLAGS = -std=c++0x -Wall

OBJECTS = main.o garage.o

main: $(OBJECTS)
        $(CXX) $(CXXFLAGS) -o $@ $^

$(OBJECTS): garage.hpp

链接规则使用自动变量,以避免重新输入目标(main)或先决条件(main.o,garage.o)。

最后一行确保如果garage.hpp文件发生更改,make知道它必须重新编译源文件。你不需要编写规则来告诉make如何编译源文件,它已经知道如何做了。


你没有制作 main.ogarage.o 的规则。 - Zereges
2
看看我上一段话:你不必编写规则来告诉make如何编译源文件:它已经知道如何做了。 - MadScientist

2

Makefile是编译代码的一种非常有效的方式。Makefile使用时间戳来检测文件中的任何更改,并仅编译更改过的文件。这样可以节省大量时间。

下面的Makefile将完美地完成您的工作。

 output: main.o garage.o
        g++ -std=c++0x -Wall main.o garage.o -o output

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

 garage.o: garage.cpp garage.hpp
        g++ -c garage.cpp

 clean:
        rm *.o output

g++rm 命令前的空格是制表符(tab)

将该文件命名为 Makefile,编译时输入 make 命令。这将创建一个名为 output 的可执行文件。

使用 ./output 运行可执行文件。


1

最直接的方法是在您的Makefile中添加以下内容(请确保第二行前面的空格为单个制表符):

all:
    g++ -std=c++0x -Wall -o main main.cpp garage.hpp garage.cpp

这绝不是最佳方法,但如果您只想编译它,那么这就是您的解决方案。阅读有关make文件的教程以获得更详细的理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接