【问题标题】:Is there a set of standard compiler options?是否有一组标准编译器选项?
【发布时间】:2015-02-14 20:44:23
【问题描述】:

我正在使用qmake 制作一个项目,我希望它易于被许多用户编译。到目前为止,我只为 Linuxgcc 编译器开发。我希望我的项目也可以在其他平台上编译。

到目前为止,我将编译器选项(我在 gcc 文档中找到)传递给 qmake,如下所示:

QMAKE_CXXFLAGS += -std=c++14 \
                  -ffloat-store \
                  -O3 \

但后来我意识到这些选项在其他编译器上可能无效,并尝试为其他流行的编译器找到等效选项,例如 clangIntel。令我惊讶的是,我发现:

  1. 优化选项-O0, -O1, -O2, -O3 对所有三个编译器都是通用的。
  2. -std=c++11-std=c++14 选项对 gccclang 很常见
  3. 据我所知,-ffloat-store 和其他一些选项仅存在于 gcc 中。

我想知道,是否有一些正式或非正式标准的选项集?

【问题讨论】:

  • 到目前为止,我看到的所有 C++ 编译器的唯一编译器选项是 E 选项,用于获取预处理代码。即使是所有健全的编译器都拼写为-E,而另一种编译器拼写为/E
  • 您可以将Conditionals 用于每个平台/编译器的选项。在您的三个选项中,唯一的内置 qmake 是 CONFIG += c++11
  • -D 和 -I 也是很常见的 IIRC(当然,在 Windows 上是 /D 和 /I)

标签: c++ gcc qmake


【解决方案1】:

POSIX 定义了一些关于 c99 命令的内容(但 AFAIK 没有关于 C++)。

但是,qmake 实用程序通常能够找出(或至少预期)什么是 C++ 编译器以及如何调用它。请注意,它正在生成一个Makefile

在 Qt 之外,您可以考虑使用 cmakeautoconf。它们都生成Makefile-s。

另见this answerProgrammers)。

【讨论】:

    【解决方案2】:

    没有。

    C++ 标准不包含任何编译器选项。这在不同的实现(甚至是同一实现的不同版本)之间可能会有很大差异。

    【讨论】:

      【解决方案3】:

      在我看来,主要编译器之间几乎没有任何共同点。

      事实上,当您针对多个平台时,任何重要的项目都需要在代码内和构建过程中进行一些微调。您最好的选择是根据我的经验(这主要是基于意见),为每个编译器制作尽可能简单的构建过程,并通过平台/编译器特定包含文件中的编译指示修复大多数“怪癖”你“自动包含”无处不在。

      【讨论】:

      • 这是关于如何处理多平台定位的最糟糕的想法。您真正需要做的是识别平台相关和平台无关的代码。然后进行设计,使依赖于平台的代码位于单独的文件中,并具有良好、稳定的 API 并且最小化。然后你为你想要支持的每个平台实现它,你的代码库中根本不需要自动包含或#ifdef 的东西。然后你使用 cmake 或类似的,你可以构建多平台,为你构建的平台链接特定于 splatform 的代码。
      • 我完全同意:将平台代码保存在单独的文件中,这些文件当然在其他平台中完全被忽略,使用实现隐藏模式等。永远不要将#ifdefs 用于这样的东西,它只是一团糟。也就是说,利用具有不同 C++ 支持级别的编译器,并淡化/增强它们在警告和错误方面各自的特质,有时确实需要一些技巧。
      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多