【问题标题】:Separate compilation and linking again单独编译并再次链接
【发布时间】:2014-03-28 21:03:17
【问题描述】:

我正在阅读有关单独编译的信息,并对流程有一个特殊的问题。假设我在一个名为 function.cpp 的文件中编写了一个函数。同样,我在头文件 function.h 中正确声明了该函数。现在一个名为 main.cpp 的主程序将使用这个函数。首先,要生成一个可以运行的可执行文件就足够了

$ g++ -o main main.cpp

这个命令是否也编译function.cpp文件还是我必须先运行

$ g++ -c function.cpp
$ g++ -o main main.cpp

现在假设我在 function.cpp 中进行了一些更改。必须重新编译哪个文件?运行就够了

$ g++ -c function.cpp

感谢您的帮助

【问题讨论】:

    标签: c++


    【解决方案1】:

    使用

    $ g++ -o main main.cpp
    

    会导致undefined reference链接器错误,因为function.h中定义的符号没有定义(如果main.cpp中实际使用了它们)。

    在第二个版本中,您还需要在第二次调用中包含第一次调用生成的目标文件。

    在第三种情况下,这取决于:如果 function 的声明发生更改(例如,标头发生更改),您将需要重新编译 main.cpp。否则你只需要再次链接可执行文件。

    gcc 可以在您使用 -MM-M 在源文件上运行时生成 Make 规则。您可以使用它来生成原始Makefile,并且您确实应该使用构建系统。

    【讨论】:

      【解决方案2】:

      您应该考虑两个不同的任务:

      1. 正在编译。这提供了一个 *.o,它包含所有函数/类/方法/等。在 *.C 文件中定义的以及其中包含的 *.h (已定义,而不仅仅是声明)。对于那些已经声明但未定义的东西,只会有一个引用(“这是我不知道的东西”)
      2. 链接。这会将所有 *.o(以及 *.a 和 *.so 或 *dll,如果您有库可以加入其中)组合在一起,并将尝试将所有未定义的引用与其他 *.o 中的定义匹配

      回到你的问题:

      $ g++ -c function.cpp
      

      这个对 g++ 的调用编译并得到一个函数。o

      $ g++ -o main main.cpp
      

      对 g++ 的调用会编译 (main.cpp) 和链接(main.o 和 ... 您可能需要向它提供所有 *.o 相关信息,以便它知道在哪里查找未定义的引用)。

      因此,如果您更改 function.cpp。你必须至少

      1. 编译得到function.o
      2. 再次链接主程序,以便 function.cpp 中的新定义链接到程序其余部分中未定义的引用。

      【讨论】:

        【解决方案3】:

        你可以编译:

        g++ -o main function.cpp main.cpp
        

        我也推荐使用 -Wall

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-02
          • 2020-11-07
          • 2013-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多