再次单独编译和链接

时间:2014-03-28 12:48:59

标签: c++

我正在阅读有关单独编译的内容,并对此过程有一个特殊的问题。假设我在一个名为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

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

使用

$ g++ -o main main.cpp

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

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

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

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

答案 1 :(得分:2)

您应该考虑两个单独的任务:

  1. 编译。这提供了一个* .o,它包含了所有的函数/类/方法/等。在* .C文件中定义,并从中包含* .h(已定义,不仅仅是声明)。对于已经宣布但未定义的内容,将只有一个参考("这里是我不知道的东西")
  2. 链接。这将所有* .o(以及* .a和* .so或* dll汇集在一起​​,如果你有混合的库),并尝试将所有未定义的引用与其他* .o
  3. 中的定义匹配

    回到你的问题:

    $ 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中的新定义将链接连接到程序其余部分的未定义引用。

答案 2 :(得分:0)

您可以使用以下内容进行编译:

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

我还建议使用-Wall