我正在阅读有关单独编译的内容,并对此过程有一个特殊的问题。假设我在一个名为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
感谢您的帮助
答案 0 :(得分:3)
使用
$ g++ -o main main.cpp
会导致undefined reference
链接器错误,因为function.h
中没有定义符号的定义(如果它们实际用于main.cpp
)
在第二个版本中,您还需要在第二个调用中包含第一次调用生成的目标文件。
在第三种情况下,它取决于:如果main.cpp
的声明发生了变化(例如标题发生了变化),则需要重新编译function
。否则,您只需要再次链接可执行文件。
gcc
可以在源文件上使用-MM
或-M
运行时生成Make规则。您可以使用它来生成原始Makefile
,您真的应该使用构建系统。
答案 1 :(得分:2)
您应该考虑两个单独的任务:
回到你的问题:
$ g++ -c function.cpp
这个对g ++的调用编译并得到一个函数.o
$ g++ -o main main.cpp
这个对g ++编译的调用(main.cpp)和链接(main.o和...你可能需要为它提供相关的* .o,以便它知道在哪里寻找未定义的引用)。
所以如果你改变function.cpp。你必须至少
答案 2 :(得分:0)
您可以使用以下内容进行编译:
g++ -o main function.cpp main.cpp
我还建议使用-Wall