C++ 使用make命令编译类文件
在我当前的计算机科学项目中,我不得不使用大量的类和类文件来帮助分解程序的巨大负载。但是,我想创建一个makefile,它能够在不使用中间“.o”步骤的情况下编译依赖项。 我已经:C++ 使用make命令编译类文件,c++,makefile,gnu,C++,Makefile,Gnu,在我当前的计算机科学项目中,我不得不使用大量的类和类文件来帮助分解程序的巨大负载。但是,我想创建一个makefile,它能够在不使用中间“.o”步骤的情况下编译依赖项。 我已经: %: %.cpp g++ -std=c++11 $< -o $@ %:%.cpp g++-std=c++11$
%: %.cpp
g++ -std=c++11 $< -o $@
%:%.cpp
g++-std=c++11$<-o$@
是的,我必须使用c++11,而不是14或17。
但是有没有一种方法可以让我编写
make foo.cpp bar.cpp
并让它运行g++-std=c++11 foo.cpp bar.cpp-o foo
?为了做你想做的事,你必须把所有的*.cpp
文件列为foo
的依赖项,然后做make foo
(或者将foo
作为Makefile中的第一个目标)编译它
foo: foo.cpp bar.cpp
g++ -std=c++11 $^ -o $@
$^
代表所有先决条件
但是,为什么不使用中间步骤?这样做,每次源文件发生更改时,您都会重新编译并重新链接整个项目。使用*.o
可以避免:
foo: foo.o bar.o
g++ -std=c++11 $^ -o $@
%.o: %.cpp
g++ -std=c++11 $< -o $@
foo:foo.o bar.o
g++-std=c++11$^-o$@
%.o:%.cpp
g++-std=c++11$<-o$@
这样可以避免不必要的重新编译
(您也可以省略
%.o
规则,因为make具有默认已定义的内置规则)make foo.cpp bar.cpp
这没有意义。你想用最终目标调用make并为它提供一个规则:foo:bar.o foo.o
当然你可以,只需为你想要创建的每个二进制文件提供规则,比如上面提到的@user0042(我想这就是你想要的)。或者更好的是,使用CMake,您将自动创建所有目标的规则。是的,但我的问题是,我有许多类放在单独的文件中。例如,我确实有foo
,这取决于bar
,但我也有foo1.cpp bar1.cpp
和sn.cpp afu.cpp
。我正在寻找一种方法将其简化,这样我就不必为每个实例编写完整的控制台命令。我有大约80个类,它们构建到基本上50个不同的文件中,所以编写所有这些都会很糟糕。另外,我还没有完成,而且bug测试是艰巨的。我不反对使用*.o
文件,我只是有很多这样的文件你不必列出你正在编译的每个文件,如果你愿意,你可以使用通配符,把所有的.cpp文件编译成.o文件,然后把所有的.o文件编译成一个可执行文件。你说的“完整控制台命令”是什么意思?使用这个解决方案,你只需要键入make foo
(假设foo是您的主要可执行文件)来更新您的程序。您确实必须在Makefile中列出*.cpp
文件,但这是一次性的成本。正如Sean Burton所指出的,您甚至可以使用make函数$(通配符)来避免这种情况。