【问题标题】:GCC versions/flags and FAMGCC 版本/标志和 FAM
【发布时间】:2018-06-18 12:18:03
【问题描述】:

我正在尝试将我们的构建系统从 make 移植到 CMake,但我遇到了一个令人惊讶地不是“Googleable”的问题 我们的代码是 C++ 11/14,使用 GCC6.2 编译良好,make 在调用 GCC 时应用了无数个开关,主要是迂腐警告。我构建了一个CMake 系统,可以毫无问题地编译(GCC 6.3)大部分代码,但由于以下原因,一些模块无法构建

灵活的数组成员'blahblah'不在'struct'的末尾

除了它出现在 C++ 代码中的原因。为什么它会在基于make 的系统中编译? AFAIK,灵活数组不是 C++ 标准的一部分。 GCC 特定的扩展?什么命令行开关控制 FAM 行为?如何让它像原来的make 系统一样编译?

如果有人需要编译代码的 sn-p

struct Foo
{
    int _10;
    double _20;
    int a[];
};

struct Bar
{
    Foo foo;
    double _1;
    int _2;
}

要添加更多上下文,cmake 文件

cmake_minimum_required(版本 3.9)

项目(foo 版本 ${FOO_VERSION} 描述“foo”)

设置(CMAKE_CXX_STANDARD 14)

设置(CMAKE_C_STANDARD 99)

add_executable(foo foo.cpp foo_backup.cpp main.cpp)

set_target_properties(foo PROPERTIES VERSION ${PROJECT_VERSION})

target_include_directories(foo PUBLIC ${CMAKE_SOURCE_DIR}/lib/include ${CMAKE_SOURCE_DIR}/lib/include/bar)

【问题讨论】:

  • 当然,如果你问人们构建文件之间可能有什么不同导致这种情况,你需要发布构建文件......
  • 不要同时改变两件事(你的编译器和你的构建系统)。让您的 cmake 东西与“已知良好”的编译器版本一起使用,然后更改编译器 - 或相反。另外,为什么不直接复制“无数”标志?
  • 灵活的数组成员出现在 C99 中 - 您的某些文件是否有可能被编译为 C 而不是 C++ 源代码?
  • @Mat,无数个标志分散在 60kb 的 make 文件中,其中有千万个 ifs。所以 a) 弄清楚最后一组应用于编译的开关是相当复杂的 b) 我觉得我们不需要它们中的大部分,它们主要是因为历史原因而存在
  • @kreuzerkrieg:...但是您的代码不再构建。同样,不要同时更改构建系统和编译器。现在,你不知道该怪什么。

标签: c++ gcc cmake gnu-make flexible-array-member


【解决方案1】:

如何让它像原来的 make 系统一样编译

恢复到 GCC 6.2。这个-pedantic 错误是在 GCC 6.3 中针对 C++ 引入的。

compilation with 6.2compilation with 6.3

禁用迂腐编译将消除错误,但需要其他放松。

【讨论】:

  • 是的,你是对的,我已经使用godbolt.org 找到它 6.2 编译我的代码,6.3 和更高版本会抱怨。我有一种感觉,如果我们想获得现代编译器,我们将不得不修复它
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多