使用g ++编译多个.cpp和.h文件。我做得对吗?

时间:2014-11-08 06:29:34

标签: c++ gcc compilation g++

让我说我有这些文件: main.cppClassA.cppClassA.hClassB.cppClassB.h

  • 主要文件包含#include "ClassA.h"#include "ClassB.h",每个.cpp文件都包含其各自的.h文件。这是对的吗?

现在我正在使用g++ *.cpp进行编译,然后我获得了一个可执行文件a.exe(Windows)

  • 我的问题是,这是正确的方法吗?并且假设我只在一个文件(cpp或h)中进行更改,这个命令也会重新编译未更改的文件(因为我看到除了a.exe之外文件夹中没有新文件)?请解释。另外我该如何预防?

P.S我不熟悉制作,也不想使用它,所以请不要在答案中参考,我读Using G++ to compile multiple .cpp and .h files但我需要更多解释我的问题。

4 个答案:

答案 0 :(得分:2)

  

我的问题是,这是正确的方法吗?

最好创建makefile并使用make来构建目标。

  

让我们说如果我只在一个文件(cpp或h)中进行更改,这个命令也会重新编译未更改的文件(因为我看到除了a.exe之外文件夹中没有新文件)?

  

请解释一下。另外我该怎么做呢?

使用makemake将帮助跟踪依赖关系并编译需要编译的文件,或者通常构建过时的目标。

答案 1 :(得分:2)

如果您想手动执行此操作,可以将所有.cpp文件编译为目标文件

g++ -c *.cpp

并链接所有目标文件

g++ *.o -o a.out

如果更改了ClassA.cpp,则可以重新编译ClassA.cpp

g++ -c ClassA.cpp

再次链接它们

g++ *.o -o a.out

至少,您不需要重新编译未更改的.cpp文件。

答案 2 :(得分:1)

对于#include,你是对的。确保你有包含警戒,以便他们的内容只包含一次。

#ifndef CLASS_A_H
#define CLASS_A_H

class classA
{

};

#endif

你可以指定-o到g ++来命名输出文件而不是' a.exe'

通常使用gcc / g ++和其他命令行编译器,策略是首先编译源文件,然后将它们与另一个命令链接。这有助于防止每次都重新编译未修改的文件。这使用了gcc

的-c开关

试试这个

g++ -c ClassA.cpp -o ClassA.o
g++ -c ClassB.cpp -o ClassB.o
g++ -c main.cpp -o main.o

g++ ClassA.o ClassB.o main.o -o myProgram.exe

答案 3 :(得分:0)

你应该为此目的使用cmake

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
project(cmake_demo)
    File(GLOB SRC_FILES src/*.cpp)
message(src: ${SRC_FILES})
add_executable(cmake_demo ${SRC_FILES})
  1. 创建CMakeLists.txt以及该文件中的上述代码
  2. 创建一个名为src的文件夹,将所有srource文件放在该文件夹中
  3. 然后打开终端并转到此CMakeLists.txt
  4. 创建文件夹构建
  5. 从终端
  6. 进入该文件夹
  7. 键入(cmake ..)然后输入
  8. 然后输入(make),然后输入
  9. 它应该按照你想要的方式编译和工作:)

    你的文件夹结构应该是这样的

    CMakeLists.txt
    src
    build
    

    希望会有所帮助:)