我有两个文件“ create-exercise.cpp”和“ exercise.hpp”。我想编写一个使用gnu ++ 17和g ++编译它们的makefile。 exercise.hpp包含在create-exercise.cpp中。我只想从create-exercise.cpp中获取二进制文件。我要使用的命令是g++ -std=gnu++17 create-exercise.cpp -o create-exercise
,并且效果很好。我尝试在make文件中使用以下内容。
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
时,请说'create-exercise.o' is up to date.
而不重新编译它。我该怎么办?
假设您要构建由编译create-exercise
得到的可执行文件create-exercise.cpp
,则可以使用以下makefile:
CXXFLAGS = -Wall -std=gnu++17
create-exercise:
create-exercise.o: create-exercise.cpp exercise.hpp
当编译器对其进行预处理时,C0]包含在exercise.hpp
中。因此,如果create-exercise.cpp
更改,exercise.hpp
应该会过时。
请注意,以上所有目标均没有配方,因此不会覆盖任何配方。当create-exercise.o
在该makefile上运行时,第一个目标只是将create-exercise
指定为default goal。
最后一条规则只是将make
前提条件添加到目标exercise.hpp
。实际上,以下makefile的作用相同:
exercise.hpp
我不确定,但也许尝试包括.hpp文件,而不是与其他文件一起编译。您可以通过使用g ++ *。cpp -I *。hpp -o输出
来实现。尝试一下,让我知道它是否适合您。