Travis-CI Ubuntu环境下CMake与g++编译C++17代码报错求助
Travis-CI Ubuntu环境下CMake与g++编译异常问题
编译失败时出现以下错误:
In file included from /usr/include/c++/10/cinttypes:35, from /home/travis/build/quicky2000/repositories/edge_matching_puzzle/include/light_border_pieces_db.h:21, from /home/travis/build/quicky2000/repositories/edge_matching_puzzle/src/border_backtracker.cpp:19: /usr/include/c++/10/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options. 32 | #error This file requires compiler and library support \ | ^~~~~ In file included from /home/travis/build/quicky2000/repositories/edge_matching_puzzle/src/border_backtracker.cpp:19: /home/travis/build/quicky2000/repositories/edge_matching_puzzle/include/light_border_pieces_db.h:48:7: error: ‘uint32_t’ has not been declared 48 | uint32_t p_left_color,
当前编译参数存在矛盾:使用g++ 10.5.0时CMake生成的命令行带有-std=c++17;使用g++ 7.5.0时带有-std=c++1z,理论上这两个标准都完全兼容C11,且代码中已包含cinttypes头文件(会自动引入cstdint),uint32_t的声明应该可见,但g似乎完全忽略了指定的-std参数。
完整编译命令如下:
/usr/bin/g++ -DEDGE_MATCHING_PUZZLE_SELF_TEST \ -I/home/travis/build/quicky2000/repositories/edge_matching_puzzle/include \ -I/home/travis/build/quicky2000/repositories/quicky_exception/include \ -I/home/travis/build/quicky2000/repositories/quicky_utils/include \ -I/home/travis/build/quicky2000/repositories/simple_gui/include \ -I/usr/include/SDL \ -I/home/travis/build/quicky2000/repositories/lib_bmp/include\ -I/home/travis/build/quicky2000/repositories/FSM_base/include \ -I/home/travis/build/quicky2000/repositories/FSM_interfaces/include \ -I/home/travis/build/quicky2000/repositories/FSM_framework/include \ -I/home/travis/build/quicky2000/repositories/parameter_manager/include \ -I/home/travis/build/quicky2000/repositories/combinatorics/include \ -I/home/travis/build/quicky2000/repositories/simplex/include\ -I/home/travis/build/quicky2000/repositories/my_cuda/include\ -I/home/travis/build/quicky2000/repositories/EXT_xmlParser/include\ -std=c++1z -Wall -ansi -pedantic -MD\ -MT CMakeFiles/edge_matching_puzzle.dir/src/border_backtracker.cpp.o -MF CMakeFiles/edge_matching_puzzle.dir/src/border_backtracker.cpp.o.d\ -o CMakeFiles/edge_matching_puzzle.dir/src/border_backtracker.cpp.o\ -c /home/travis/build/quicky2000/repositories/edge_matching_puzzle/src/border_backtracker.cpp
排查过程
- 最初怀疑CMake未使用正确编译器,因日志中有如下内容:
-- The CXX compiler identification is GNU 10.5.0 -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/g++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- The C compiler identification is GNU 10.5.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/gcc - skipped -- Detecting C compile features -- Detecting C compile features - done
但经确认,"skipped"并非问题所在。
- g安装无异常:通过以下命令安装g-10,且使用自定义Makefile编译时完全正常:
sudo apt-get -y install g++-10 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 sudo update-alternatives --set gcc /usr/bin/gcc-10
环境变更情况
- 4个月前使用g++ 10.3.0时可正常构建,唯一变化是apt升级后g++版本升至10.5.0;
- 在默认gcc为7.5.0的旧版Travis Ubuntu环境中,同样出现该问题,且该版本gcc未进行过变更。
内容的提问来源于stack exchange,提问作者Quicky
相关产品推荐
相关产品推荐

