是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)

Is there a proper way to use template commands for object files in a makefile? (C++)

本文关键字:文件 命令 C++ 方法 是否 对象      更新时间:2023-10-16

我目前正在尝试创建一个模板make命令,该命令应该根据cpp/头文件创建%.obj。 我目前在我的文件夹中有以下文件:main.cpp,sort.cpp,sort.h 这是我尝试运行的生成文件:

CXX = cl
CXXFLAGS = /EHsc /nologo
MAIN_EXECUTABLE = main.exe
%.obj: %.cpp %.h
$(CXX) $(CXXFLAGS) /c $<
$(MAIN_EXECUTABLE): main.obj sort.obj
link $(CXXFLAGS) $^ /OUT:$@
all: $(MAIN_EXECUTABLE)
.PHONY: all
clean:
del *.obj
.PHONY: clean
distclean: clean
del $(MAIN_EXECUTABLE)
.PHONY: distclean

控制台输出:make: *** No rule to make target `main.obj', needed by `main.exe'.

所以我的问题是,我该如何解决这个问题?谢谢!

不能将%.h添加到模式规则中,除非要使用此模式规则构建的每个.cpp文件都具有等效的.h文件。 否则,当 make 想要使用此模式规则构建main.obj时,它会看到main.cpp存在,并且确实存在,然后它会看到main.h存在,而不存在,因此模式规则不匹配。 Make 一直在寻找可能构建main.obj但没有其他模式规则,因此您会看到错误。

您有两种选择:如果几乎所有.cpp文件都有.h文件,那么您可以为少数不喜欢这样做的文件创建明确的规则:

%.obj : %.cpp %.h
$(CXX) $(CXXFLAGS) /c $<
main.obj : main.cpp
$(CXX) $(CXXFLAGS) /c $<

或者,您可以省略%.h并在其他地方声明标头先决条件,如下所示:

%.obj : %.cpp
$(CXX) $(CXXFLAGS) /c $<
sort.obj : sort.h

后者是通常编写makefile的方式,因为.cpp文件只包含一个头文件几乎闻所未闻;通常无论如何,您都需要将所有标头声明为先决条件。 通常,这是通过向生成文件添加自动依赖项生成工具来完成的。

我会说你似乎运行在Windows上,而不是像GNU/Linux或MacOS这样的基于POSIX的系统,所以依赖于GCC或Clang等编译器功能的自动依赖生成方法可能对你不可用。