【问题标题】:Is normal to list all the cpp/cc files when compiling with g++?使用 g++ 编译时列出所有 cpp/cc 文件是否正常?
【发布时间】:2020-02-15 14:51:08
【问题描述】:

我在 GTKMM 教程中做“Hello World”,“app”使用三个文件,main.cchelloworld.hhelloworld.cc

一开始我以为是编译main.cc:

g++ -o HW main.cc $(pkg-config ... )

就够了,但是会报错(未定义对Helloworld::Helloworld的引用)等等。

换句话说,它编译 main 和 header,而不是 HW 类,这是有道理的,因为 header 包含在 Main 而不是 Helloworld.cc 中。问题是我有点害怕包含它,因为我在其他问题中读到“包含所有内容是一种不好的做法”。

话虽如此,当我使用同一命令中的所有文件进行编译时:

g++ -o HW main.cc helloworld.cc $(pkg-config ... )

“应用程序”可以正常运行。

那么,既然使用最后一个命令有效,那么以这种方式编译是一种好习惯吗?

如果我的应用使用大量类会怎样?

我必须在命令中手动将它们全部写下来吗?

如果不是,我必须使用#include吗?

对所有 cc 使用的文件使用#include 是一种好习惯吗?

【问题讨论】:

  • 永远不要包含 .c/.cc//cpp 文件。您可以像使用 g++ -o HW main.cc helloworld.cc $(pkg-config ... ) 一样将它们链接在一起
  • 当您有很多文件时,请使用 make 或 ide 等构建系统,您可以在其中将所有文件放入项目中。
  • @GNSYS,一旦超过 3 或 4 个文件,在 IDE 或其他构建管理系统中使用 makefile、CMake、项目设置会变得很有用。
  • 我认为你可以做类似g++ -o HW *.cc $(pkg-config ... ) 的事情,但我不能 100% 确定,因为我不使用 Linux。这也不能让您控制它拾取的文件。
  • 小伙子们在 cmets 中回答太多了

标签: c++ c++11 g++ gtkmm3


【解决方案1】:

g++编译时列出所有cpp/cc文件正常吗?

是的,完全。

它怎么会知道你想要它编译什么源代码?

问题是我有点害怕包含它,因为我在其他问题中读到包含所有内容是一种不好的做法。

#includeing 多余的标头是不好的做法。

将完整的源代码传递给编译器是不行的。

对所有 cc 使用的文件使用#include 是一种好习惯吗?

绝对不是。

如果我的应用使用大量类会怎样?我必须在命令中手动将它们全部写下来吗?

没有。您应该使用为您处理此问题的构建系统。这可能是一个 IDE,它获取项目中的所有文件并依次将它们传递给编译器,或者它可能是带有 *.cpp 通配符的 CMakeLists.txt/Makefile(尽管我实际上建议明确列出源文件,一个接一个;这并不难)。

在命令行上手动调用g++ 可以进行快速测试,但在实际使用中,您不想被这种机器玩弄。

【讨论】:

  • @GNSYS: 好样的!
【解决方案2】:

对所有 cc 使用的文件使用 #include 是一种很好的做法

这不仅是不好的做法,永远不要这样做。

为了创建可执行文件,您实际上必须做两件事:

  1. 将所有源代码文件编译为目标文件或库。

  2. 将所有目标文件和所需库链接到可执行文件中。

您似乎忽略了链接阶段是在单独的源文件中定义的符号被解析或链接的地方。

【讨论】:

  • 在某些极端情况下您可能想要这样做,但在更多情况下您应该在考虑包含之前执行上述1, 2
  • 我从来没有,不是一次,需要包含.cpp
【解决方案3】:

我必须在命令中手动将它们全部写下来吗?

为了让编译器知道在你的头文件中声明的符号的定义,你必须包含所有的源文件。此规则的例外情况可能是(但不限于)包含模板元编程 (TMP) 代码的头文件,这些代码通常完全存在于头文件中。

如果我的应用使用大量类会怎样?

大多数大型 C++ 项目都使用 CMAKE 等构建配置工具来为它们生成 makefile。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2011-10-01
    • 1970-01-01
    • 2011-03-13
    • 2021-12-12
    • 2012-04-04
    相关资源
    最近更新 更多