Ошибка сборки ISO C++ запрещает массив нулевого размера f_handle [-Wpedantic] только при использовании виртуальной машины snapcraft.

Я использую инструменты командной строки catkin для создания benchmark_catkin, который представляет собой оболочку catkin для Google эталон. Сборка использует файл CMakeLists и до сих пор всегда работала нормально на Ubuntu 18.04. Сейчас я пытаюсь собрать этот пакет с помощью snapcraft. Snapcraft имеет плагин catkin-tools и настраивает виртуальную машину перед сборкой. Однако теперь я получаю сообщение об ошибке из системной библиотеки, и сборка не удалась:

In file included from /root/parts/workspace/install/usr/include/x86_64-linux-gnu/bits/fcntl.h:61:0,
                 from /root/parts/workspace/install/usr/include/fcntl.h:35,
                 from /root/parts/workspace/build/benchmark_catkin/benchmark_src-prefix/src/benchmark_src/src/sysinfo.cc:23:
/root/parts/workspace/install/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h:355:27: error: ISO C++ forbids zero-size array ‘f_handle’ [-Wpedantic]
   unsigned char f_handle[0];
                           ^
In file included from /root/parts/workspace/install/usr/include/x86_64-linux-gnu/bits/fcntl.h:61:0,
                 from /root/parts/workspace/install/usr/include/fcntl.h:35,
                 from /root/parts/workspace/build/benchmark_catkin/benchmark_src-prefix/src/benchmark_src/src/timers.cc:23:
/root/parts/workspace/install/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h:355:27: error: ISO C++ forbids zero-size array ‘f_handle’ [-Wpedantic]
   unsigned char f_handle[0];
                           ^
make[5]: *** [src/CMakeFiles/benchmark.dir/sysinfo.cc.o] Error 1
make[5]: *** Waiting for unfinished jobs....
make[5]: *** [src/CMakeFiles/benchmark.dir/timers.cc.o] Error 1
make[4]: *** [src/CMakeFiles/benchmark.dir/all] Error 2
make[4]: *** Waiting for unfinished jobs....
make[3]: *** [all] Error 2
make[2]: *** [benchmark_src-prefix/src/benchmark_src-stamp/benchmark_src-build] Error 2
make[1]: *** [CMakeFiles/benchmark_src.dir/all] Error 2
make: *** [all] Error 2

Я предполагаю, что эта ошибка относится к массиву нулевого размера в библиотеке libc6-dev. Поскольку я использую base: core18 в своем snapcraft.yaml, а также использую систему Ubuntu 18.04, мне интересно, почему я просто получаю сообщение об ошибке в виртуальной машине. Это ошибка в библиотеке? Как я могу это решить?


Для справки, мой файл snapcraft.yaml:

name: nav 
base: core18 
version: 'w1.0'
summary: The Nav Software  
description: |

grade: devel  
confinement: strict 

plugs:   
  network:
  network-bind:

parts: 

  core-dep:
    plugin: nil
    build-packages:
      - autoconf
      - libtool
      - git

  workspace:
    plugin: catkin-tools
    source: .
    catkin-packages: [catkin_simple, glog_catkin, gflags_catkin, benchmark_catkin]
    after: [core-dep]

По запросу вот код ошибочной строки /usr/include/x86_64-linux-gnu/bits/fcntl-linux.h:

/* File handle structure.  */
struct file_handle
{
  unsigned int handle_bytes;
  int handle_type;
  /* File identifier.  */
  unsigned char f_handle[0];
};

person pixelpress    schedule 11.03.2020    source источник
comment
Добавлен. Однако мне интересно, почему это дает ошибку в одном случае, а не в другом...   -  person pixelpress    schedule 11.03.2020
comment
Различаются ли настройки компилятора между сборками?   -  person drescherjm    schedule 11.03.2020
comment
Это то, что я пытаюсь понять. Но я не знаю, как получить эту информацию из инструмента snapcraft.   -  person pixelpress    schedule 11.03.2020


Ответы (1)


Я ознакомился с проектом. CMakeLists.txt из reference_catkin внутренне проверяет google/benchmark и создает его. Ошибка исходит из этой сборки.

CMakeLists.txt google/benchmark устанавливает множество параметров компилятора и, в частности, -pedantic-errors (а также -pedantic и -Werror), которые заставляют компилятор останавливаться при любом использовании языкового расширения. Честно говоря, на мой взгляд, CMakeLists.txt не должен устанавливать какие-либо предупреждающие флаги и особенно флаги -Werror или -pedantic-errors без запроса пользователя, поэтому я считаю это ошибкой, но разработчики Google могут не согласиться.

Заголовок glibc использует расширение языка. Но это нормально, потому что предупреждения в системных заголовках следует игнорировать. Таким образом, фактическая причина сбоя сборки заключается в том, что заголовок glibc не обрабатывается как системный заголовок.

Я ничего не знаю о snapcraft, но подозреваю, что причина проблемы именно там.

person eerorika    schedule 11.03.2020