我继承了一些C++代码,这些代码被糟糕地编写在一个cpp文件中,其中包含主函数和一堆其他函数。同时还有一些包含类和它们的函数定义的.h文件。
直到现在,该程序是使用命令g++ main.cpp
进行编译的。现在我已经将类分离到.h和.cpp文件中,我需要使用一个makefile吗?还是仍然可以使用g++ main.cpp
命令?
我继承了一些C++代码,这些代码被糟糕地编写在一个cpp文件中,其中包含主函数和一堆其他函数。同时还有一些包含类和它们的函数定义的.h文件。
直到现在,该程序是使用命令g++ main.cpp
进行编译的。现在我已经将类分离到.h和.cpp文件中,我需要使用一个makefile吗?还是仍然可以使用g++ main.cpp
命令?
g++ main.cpp other.cpp etc.cpp
或者你可以单独编译它们。然后将所有生成的 ".o" 文件链接在一起。
g++ *.cpp -o output
。 - rubenvb要单独编译而不链接,您需要添加-c
选项:
g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out
g++ -o my_executable myclass.o main.o
。 - eric# "all" is the name of the default target, running "make" without params would use it
all: executable1
# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker
CC=$(CXX)
# tell which files should be used, .cpp -> .o make would do automatically
executable1: file1.o file2.o
make
只会重新编译需要重新编译的内容。还可以添加一些微调来生成头文件依赖关系,这样make
也可以正确地重新构建由于头文件更改而需要重新构建的内容。我知道这个问题几年前就被问过了,但是我还是想分享一下我通常如何编译多个c++文件的方法。
g++ -c *.cpp -o myprogram
。./myprogram
就是这些啦!!
我使用 * 的原因是如果你有30个cpp文件,是不是要打出全部的文件名?还是直接使用 * 符号节省时间呢 :)
附:仅在您不关心makefile时使用此方法。
#ifndef/#define/#endif
。或者,如果您使用的是更现代的编译器,则可以使用#pragma once
。 - ThisGuyCantEveng++-10 /abs/src/path/*.cpp -o /abs/src/path/binary_file
会出错,但是 g++-10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file
可以正常工作...... 这是什么鬼? - ThisGuyCantEven.h
文件与编译无关...只需关心cpp文件...所以输入以下命令:g++ filename1.cpp filename2.cpp main.cpp -o myprogram
这意味着你正在编译每个cpp文件,然后将它们链接在一起成为myprogram
。
然后运行程序 ./myprogram
如果你想的话,仍然可以直接使用 g++:
g++ f1.cpp f2.cpp main.cpp
f1.cpp和f2.cpp是包含函数的文件。有关如何使用make进行构建的详细信息,请参阅优秀的GNU make文档。
正如rebenvp所说,我使用了:
g++ *.cpp -o output
然后为输出做这个:
./output
但更好的解决方案是使用make
文件。在此处阅读有关make
文件的更多信息。这里
还要确保您已将所需的.h
文件添加到.cpp
文件中。
g++-10 /abs/src/path/*.cpp -o /abs/src/path/binary_file
会出错,但是
g++-10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file
可以正常工作...... 这是什么鬼? - ThisGuyCantEven#include <myheader.hpp>
,你可以使用以下方法:g++ *.cpp -I. -o out
假设所有需要的.cpp
和.h
文件都在同一个文件夹中,您可以使用单个命令来完成此操作。
g++ *.cpp *.h -Wall && ./a.out
它将同时编译和执行。
g++ *.cpp
足以编译所有的cpp文件,因为只要我们还没有链接,顺序并不重要。 - aderchox