Intereting Posts
Как остановить Network Manager от постоянного запроса беспроводного пароля Как удалить линзы единства? Можно ли скопировать мою ОС Ubuntu с жесткого диска на USB-накопитель и загрузиться с этой палочки со всеми моими программами? Рабочий стол ярлык и блокировка для запуска для phpstorm не удалось запустить программу Почему не открывается файл .profile при открытии терминала? Обновление golang на Ubuntu Как установить TeXMaker 3? Захват номера из строкового вывода в командной строке Какая самая лучшая программа загрузки для ubuntu? Обновите все программное обеспечение с помощью диспетчера обновлений XUbuntu 12.04.1 без обновления ядра «Перезагрузите и выберите правильное загрузочное устройство» после очистки Ubuntu 13.04 Когда приложение сбой без вывода ошибки, есть ли журнал, который я могу проверить? Открыть файл по щелчку мыши по пути к файлу в терминале Модем MTS Mblaze не распознается Перезаписать существующий каталог?

GCC7 ARMv7 – ошибка компиляции в стандартных заголовках

Я пытаюсь скомпилировать мое приложение C ++ 1z для архитектуры ARMv7-a, используя GCC7. Я тестировал приложение и работаю в Ubuntu 16.04 (x86_64), но когда я пытаюсь скомпилировать его на устройстве ARM (Ubuntu 14.04), я получаю ошибки компиляции в стандартных заголовках. Одним из примеров ошибок является:

In file included from /usr/include/c++/7/bits/ios_base.h:46:0, from /usr/include/c++/7/ios:42, from /usr/include/c++/7/istream:38, from /usr/include/c++/7/sstream:38, from /usr/include/c++/7/complex:45, from /home/ubuntu/work/git_rep/surrogate/external/opencv/modules/core/include/opencv2/core/cvstd.inl.hpp:47, from /home/ubuntu/work/git_rep/surrogate/external/opencv/modules/core/include/opencv2/core.hpp:3217, from /home/ubuntu/work/git_rep/surrogate/external/opencv/modules/videoio/include/opencv2/videoio.hpp:46, from /home/ubuntu/work/git_rep/surrogate/service/streaming/video/stereo_camera_stream.h:5, from /home/ubuntu/work/git_rep/surrogate/service/streaming/video/stereo_camera_stream.cc:1: /usr/include/c++/7/system_error: At global scope: /usr/include/c++/7/system_error:151:31: error: 'error_category' does not name a type; did you mean 'error_code'? error_code(int __v, const error_category& __cat) noexcept ^~~~~~~~~~~~~~ error_code /usr/include/c++/7/system_error:160:27: error: 'error_category' does not name a type; did you mean 'error_code'? assign(int __v, const error_category& __cat) noexcept ^~~~~~~~~~~~~~ error_code /usr/include/c++/7/system_error:180:11: error: 'error_category' does not name a type; did you mean 'error_code'? const error_category& ^~~~~~~~~~~~~~ error_code /usr/include/c++/7/system_error:199:11: error: 'error_category' does not name a type; did you mean 'error_code'? const error_category* _M_cat; ^~~~~~~~~~~~~~ error_code /usr/include/c++/7/system_error: In constructor 'std::error_code::error_code()': /usr/include/c++/7/system_error:149:20: error: class 'std::error_code' does not have any field named '_M_cat' : _M_value(0), _M_cat(&system_category()) { } ^~~~~~ /usr/include/c++/7/system_error:149:28: error: 'system_category' was not declared in this scope : _M_value(0), _M_cat(&system_category()) { } ^~~~~~~~~~~~~~~ /usr/include/c++/7/system_error:149:28: note: suggested alternative: /usr/include/c++/7/system_error:134:40: note: 'std::_V2::system_category' _GLIBCXX_CONST const error_category& system_category() noexcept; ^~~~~~~~~~~~~~~ 

Компилятор рекомендует заменить std::system_category на std::_V2::system_category , как будто в стандартном заголовке будет ошибка. Я сравнил заголовок с заголовком, который я использовал при компиляции моего приложения для среды x86_64, и они кажутся такими же, что оставляет мне догадываться, почему не выполняется таргетинг ARMv7-a для компиляции.

Я использую CMake для создания исходного кода, поэтому, насколько мне известно, не должно быть никаких других различий в конфигурации, кроме системных опций. Я сравнил конфигурацию двух компиляторов, которые я использовал при запуске gcc -v . Они заключаются в следующем:

GCC7 (x86_64)

 Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.2.0-1ubuntu1~16.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 7.2.0 (Ubuntu 7.2.0-1ubuntu1~16.04) 

GCC7 (ARMv7-a)

 Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/7/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.2.0-1ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=gcc4-compatible --disable-libstdcxx-dual-abi --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --disable-werror --enable-multilib --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf Thread model: posix gcc version 7.2.0 (Ubuntu/Linaro 7.2.0-1ubuntu1~14.04) 

Одна из отличий в конфигурации, которая выделялась для меня, --with-default-libstdcxx-abi , которая настроена на gcc4-compatible для ARMv7-a и new для x86_64, так как она влияет на реализацию classа error_category .

Я не уверен, как это может вызвать ошибку компиляции, которую я вижу, поэтому я обратился к вам. Какая может быть причина и возможное исправление ошибки компиляции, которую я описал?

редактировать

После разбиения файла заголовка, включенного в файл, на два отдельных заголовка и – в результате – единицы компиляции, ошибки компиляции превратились в ошибки компоновщика, все похожее на следующее:

 ../../lib/libservice.a(duplicate_camera_stream.cc.o):duplicate_camera_stream.cc:(.text+0x12c4): first defined here ../../lib/libservice.a(simulated_video_stream.cc.o): In function `std::make_error_code(std::io_errc)': simulated_video_stream.cc:(.text+0x100d8): undefined reference to `std::iostream_category()' ../../lib/libservice.a(simulated_video_stream.cc.o): In function `std::make_error_condition(std::io_errc)': simulated_video_stream.cc:(.text+0x10110): undefined reference to `std::iostream_category()' 

Это привело меня к мысли, что может быть несовместимость с стандартом C ++ библиотек OpenCV, с которым я статически привязываюсь.

Решение

После компиляции исходного кода OpenCV с использованием того же C ++-стандарта, что и остальная часть моего кода, ошибки привязки исчезли, а assembly была успешной.

Не исключено, что включение заголовков OpenCV в и связывание библиотек более старого стандарта C ++ против приложения с другим стандартом C ++; ошибки компоновщика и / или компиляции?