如何在 Ubuntu 中使用 g++ 整齐地编译 C++ 程序

Ada*_*amT 0 c++ compilation

我正在 Ubuntu 操作系统的桌面上用 C++ 编写一个简单的练习程序。这是我的 main.cpp,其中包含 main() 方法:

#include "miscClass1.h"
#include <iostream>

using namespace std;

int main(){
    
    miscClass1 A(3, 5);
    cout << A.getX() << endl;
    
}
Run Code Online (Sandbox Code Playgroud)

这是我的杂项类的头文件,其中我只定义了一些简单的字段和函数(misClass1.h)


#ifndef MISCCLASS1_H
#define MISCCLASS1_H

class miscClass1 {
    
    int X;
    int Y;
    
    public:
    
    miscClass1(int x, int y);
    
    int addXY();//adds the two variables x and y
    
    int getX();
    int getY();//accessors
    
    void setX(int x);
    void setY(int y);//mutators
};

#endif
Run Code Online (Sandbox Code Playgroud)

这是类的头文件的源文件(misClass1.cpp):

#include "miscClass1.h"

miscClass1::miscClass1(int x, int y)
{
    
    X = x;
    Y = y;
    
}

int miscClass1::addXY()
{
    
    return (X + Y);
    
}

int miscClass1::getX()
{
    
    return (X);
    
}

int miscClass1::getY()
{
    
    return (Y);
    
}

void miscClass1::setX(int x)
{
    
    X = x;
    
}

void miscClass1::setY(int y)
{
    
    Y = y;
    
}
Run Code Online (Sandbox Code Playgroud)

这可行,但我必须使用命令:

$g++ main.cpp misClass1.cpp
Run Code Online (Sandbox Code Playgroud)

在编译时,如果我必须编译一个包含多个类/库的严肃程序,每个类/库都存储在自己的 .cpp 文件中,那么即使有数百或数千个,我也需要包含其中的每一个,这将是遥不可及的。如何更有效地编译我的程序,而不在编译时调用每个文件?我还想知道我在该计划中所做的其他事情是否是不好的做法。

Dir*_*tel 8

您可能想了解make. 在最简单的情况下,您可以执行类似这样的操作,这在单个文件中完全通用Makefile

sources :=      $(wildcard *.cpp)
objects :=      $(sources:.cpp=.o)

myapp:          $(objects)
                $(CXX) -o $@ $^
Run Code Online (Sandbox Code Playgroud)

它有两件事。它通过依赖目录列表来定义“源”。因此,如果您添加另一个,比如说,它会自动myclass2.cpp添加到列表中。接下来,它将“对象”定义为源中文件的转换,但将结尾替换为. 因为了解编译,这就够了(!!)。.cpp.omake

最后我们说我们想要一个myapp依赖于“对象”的构建目标(您可以给它任何名称)。声明了实际的依赖关系,因此现在make知道它需要创建对象并查看前面的两个声明以弄清楚如何创建。$@然后,它使用编译器根据右侧的依赖项(通过 )创建左侧的目标(通过 定义$^

您可以通过添加以下内容来模拟“空运行”中的构建-n

$ make -n
g++    -c -o main.o main.cpp
g++    -c -o misClass1.o miscClass1.cpp
g++ -o myapp main.o miscClass1.o
$ 
Run Code Online (Sandbox Code Playgroud)

如果你删除-n,它就会。您可以(但不必CXXFLAGS)通过等等定义选项。实际的编译器选择、C++ 语言风格等也是如此。

所以补充说,

 CXXFLAGS = -Wall -pedantic -O2
Run Code Online (Sandbox Code Playgroud)

让您构建优化的二进制文件:

 $ make
 g++ -Wall -pedantic -O2   -c -o main.o main.cpp
 g++ -Wall -pedantic -O2   -c -o miscClass1.o miscClass1.cpp
 g++ -o myapp main.o miscClass1.o
 $ 
Run Code Online (Sandbox Code Playgroud)

另一个主要好处是,您现在只需更改任何 C++ 文件,然后说它make就会处理好事情。还有更多(这里有大量已回答的问题),但这应该可以帮助您继续。

  • 不错的介绍 (2认同)