如何为包含头文件的目标编写生成文件?
How to write makefile for a target that includes a header file?
我有两个文件"create-exercise.cpp"和"exercise.hpp"。我想写一个makefile来使用gnu++ 17和g ++来编译它们。exercise.hpp 包含在 create-exercise.cpp 中。我只想从创建练习中获得一个二进制文件.cpp。我将使用的命令g++ -std=gnu++17 create-exercise.cpp -o create-exercise
并且运行良好。我尝试在制作文件中使用以下文件。
CXXFLAGS=-Wall -std=gnu++17
create-exercise: create-exercise.cpp exercise.hpp
但这产生了以下g++ -Wall -std=gnu++17 create-exercise.cpp exercise.hpp -o create-exercise
我不希望exercise.hpp
包含在编译命令中。我也尝试使用以下方法。
CXXFLAGS=-Wall -std=gnu++17
create-exercise.o: create-exercise.cpp exercise.hpp
这产生了g++ -Wall -std=gnu++17 -c -o create-exercise.o create-exercise.cpp
.我不想要-c
标志。因为当我尝试运行create-exercise.o
时会导致权限被拒绝错误。我也尝试了以下方法:
CXXFLAGS=-Wall -std=gnu++17
create-exercise.o: create-exercise.cpp exercise.hpp
$(CXX) $(CXXFLAGS) create-exercise.cpp -o create-exercise.o
但是当我编辑时exercise.hpp
make 说'create-exercise.o' is up to date.
并且没有重新编译它。 我该怎么办?
在生成文件中写入的规则是:
create-exercise.o: exercise.hpp
这是一个没有配方的规则,它只是在目标create-exercise.o
上增加了一个先决条件(exercise.hpp
(,即每当exercise.hpp
发生变化时,create-exercise.o
都应该重建。
但是,提供该规则时的问题是GNU Make假定create-exercise.o
是在构建create-exercise
时从C源文件生成的对象文件。因此,它不会链接C++库,而是链接 C 库,这就是为什么您有对std::cout
的未定义引用的喜欢错误。
GNU Make 有以下隐式规则用于从C++源文件生成可执行文件:
%: %.cpp
# commands to execute (built-in):
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
您可以使用该规则的配方从creating-exercise.o
构建create-exercise
,并仍creating-exercise.o
视为从C++源文件生成的对象文件:
create-exercise: create-exercise.o
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
然后,整个生成文件将是:
CXXFLAGS = -Wall -std=gnu++17
create-exercise: create-exercise.o
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
create-exercise.o: exercise.hpp
目标create-exercise
也成为默认目标,因为它是生成文件中的第一个规则。如果您不指定要make
的任何内容,则它是要构建的目标。
你可以这样做:
CXXFLAGS = -Wall -std=gnu++17
create-exercise: create-exercise.o
$(LINK.cpp) $^ $(LDLIBS) -o $@
create-exercise.o: exercise.hpp
这说:从目标文件create-exercise.o
构建create-exercise
,如果它被更改了。 如果头文件exercise.hpp
更改,它说重建create-exercise.o
;如果标头更改,则修改或重建源文件是不对的。 它是依赖于标头的对象文件。
制作有许多内置规则。 其中包括知道如何链接程序的规则,但不幸的是,它假设您的目标文件是从 C 文件构建的,因此如果您使用的是C++则必须创建特定的配方。 但是你仍然可以使用 GNU make 的默认变量。
它还知道如何从.cpp
文件自行构建.o
文件:您无需编写该配方。
我不确定,但也许尝试包含 .hpp 文件而不是与其他文件一起编译它。你可以通过使用 g++ *.cpp -I *.hpp -o 输出来做到这一点
尝试一下,让我知道它是否适合您。
- 使用mongocxx驱动程序时包含头文件问题
- 如何为包含头文件的目标编写生成文件?
- 如何在 CMakeLists.txt Qt Creator 中包含头文件?
- 当包含头文件的文件不在根项目文件夹中时,如何包含它
- 在生成文件先决条件中包含头文件的原因
- My Project的属性配置正确,但Visual Studio仍然无法打开包含头文件
- 在 PostgreSQL C 扩展中包含头文件
- 是否可以在C++中以间接方式包含头文件
- 是否需要包含头文件?
- 如何在不包含完整的文件系统头的情况下使用文件系统的类路径C++17?
- 我收到未声明的标识符错误,但我已包含头文件?
- 为什么我们需要构建一个提升库,仅仅包含头文件还不够吗,因为提升是模板
- C++:当顺序真正重要时,如何保证在项目中包含头文件的顺序
- 如何在C++中包含头文件时错误地重载
- 我在C++中无效使用不完整的类型类错误,如何正确包含头文件?
- 虚幻引擎4.16,C++包含头文件
- C++多次包含头文件
- 令牌之前的预期类名 '{' - 包含头文件和 CPP 文件
- 可以将标头文件包含在多个源文件中,而无需重复保护
- 有条件地将文件包含在C++标头中