【问题标题】:Compiling multiple .cpp and .h files using g++. Am I doing it right?使用 g++ 编译多个 .cpp 和 .h 文件。我做对了吗?
【发布时间】:2015-01-05 00:38:01
【问题描述】:

假设我有这些文件: 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 我不熟悉 make 也不想使用它,所以请不要在答案中提及它,我阅读了 Using G++ to compile multiple .cpp and .h files 但我需要更多关于我的问题的解释。

【问题讨论】:

    标签: c++ gcc compilation g++


    【解决方案1】:

    您应该为此目的使用 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 的文件夹,将所有源文件放在该文件夹中
    3. 然后打开终端并移动到这个 CMakeLists.txt
    4. 创建文件夹构建
    5. 从终端进入该文件夹
    6. 输入 (cmake .. ) 然后回车
    7. 然后输入(make)然后输入

    它应该按照你想要的方式编译和工作:)

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

    CMakeLists.txt
    src
    build
    

    希望能帮到你:)

    【讨论】:

    • cmake 是一个高级工具。让 OP 从经典 make 开始,直到他能够理解这些不同工具之间的区别。
    【解决方案2】:

    如果你想手动做,你可以把你所有的 .cpp 文件编译成目标文件

    g++ -c *.cpp
    

    并链接所有目标文件

    g++ *.o -o a.out
    

    如果 ClassA.cpp 改变了,你可以重新编译 ClassA.cpp

    g++ -c ClassA.cpp
    

    并再次链接它们

    g++ *.o -o a.out
    

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

    【讨论】:

      【解决方案3】:

      对于#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
      

      【讨论】:

        【解决方案4】:

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

        最好创建一个makefile 并使用make 来构建您的目标。

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

        是的。

        请解释一下。还有怎么防止呢?

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

        【讨论】:

          猜你喜欢
          • 2011-03-13
          • 2014-03-24
          • 1970-01-01
          • 2019-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-31
          相关资源
          最近更新 更多