Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用make命令编译类文件_C++_Makefile_Gnu - Fatal编程技术网

C++ 使用make命令编译类文件

C++ 使用make命令编译类文件,c++,makefile,gnu,C++,Makefile,Gnu,在我当前的计算机科学项目中,我不得不使用大量的类和类文件来帮助分解程序的巨大负载。但是,我想创建一个makefile,它能够在不使用中间“.o”步骤的情况下编译依赖项。 我已经: %: %.cpp g++ -std=c++11 $< -o $@ %:%.cpp g++-std=c++11$

在我当前的计算机科学项目中,我不得不使用大量的类和类文件来帮助分解程序的巨大负载。但是,我想创建一个makefile,它能够在不使用中间“.o”步骤的情况下编译依赖项。 我已经:

%: %.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函数$(通配符)来避免这种情况。