我在GTKMM教程中做"Hello World","app"使用三个文件,main.cc
,helloworld.h
和helloworld.cc
。
一开始我以为编译 main.cc:
g++ -o HW main.cc $(pkg-config ... )
就足够了,但给出了错误(未定义对Helloworld::Helloworld
的引用(等。
换句话说,它编译主类和标头,但不编译HW
类,这是有道理的,因为标头包含在 Main 中,而不是Helloworld.cc
中。问题是我有点害怕包括它,因为我在其他问题中读到"包括所有内容是一种不好的做法"。
话虽如此,当我使用同一命令中的所有文件进行编译时:
g++ -o HW main.cc helloworld.cc $(pkg-config ... )
"应用程序"工作没有错误。
那么,既然使用最后一个命令有效,那么以这种方式编译是一种好的做法吗?
如果我的应用使用大量类会怎样?
我必须在命令中手动将它们全部写下来吗?
如果没有,我必须使用#include
吗?
对所有cc 使用的文件使用 #include 是否是一种好习惯?
使用 g++ 编译时列出所有 cpp/cc 文件正常吗?
是的,完全。
否则它怎么知道你想编译什么源代码?
问题是我有点害怕包括它,因为我在其他问题中读到包括所有内容是一种不好的做法。
#include
多余的标头是一种不好的做法。
将完整的源代码传递给编译器则不是。
对所有 cc 使用的文件使用 #include 是否是一种好习惯?
绝对不行。
如果我的应用使用大量类会怎样?我必须在命令中手动将它们全部写下来吗?
不。您应该使用为您处理此问题的构建系统。这可能是一个IDE,它获取项目中的所有文件并依次将它们传递给编译器,或者它可以是一个带有*.cpp
通配符的CMakeLists.txt
/Makefile
(尽管我实际上建议明确地列出源文件,一个接一个;这并不难(。
在命令行上手动调用g++
对于快速测试来说很好,但对于实际使用,您不想在这样的机器上小丑。
是对所有 cc 使用的文件使用 #include 的好习惯
这不仅是不好的做法,永远不要这样做。
为了创建可执行文件,您实际上必须做两件事:
将所有源代码文件编译为目标文件或库。
将所有目标文件和所需的库链接到可执行文件中。
您似乎忽略了链接阶段是解析或链接单独源文件中定义的符号的要点。
我必须在命令中手动将它们全部写下来吗?
要使编译器了解标头中声明的符号的定义,必须包含所有源文件。此规则的例外情况可以是(但不限于(包含模板元编程 (TMP( 代码的标头,这些代码通常完全存在于头文件中。
如果我的应用使用大量类会怎样?
大多数大型C++项目都利用构建配置工具(如 CMAKE(来处理生成文件。