【发布时间】: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