编译MMMTools时出现‘operator/’不属于std::filesystem错误如何解决
问题原因分析
- 首先
std::filesystem::operator/是C++17才正式纳入标准库的特性,你的编译错误本质是编译器没有正确识别该特性的相关符号 - 你当前的CMake配置确实启用了高于C17的标准(
-std=c++2a是C20的早期预览版本),但存在两个适配问题:set(CMAKE_CXX_STANDARD_DEFAULT)的配置关闭了CMake对C++标准的自动管理逻辑,部分环境下会导致手动添加的-std=c++2a参数无法正确传递到编译环节- 项目原配置适配Ubuntu 18.04(默认GCC 7),而Ubuntu 20.04默认使用GCC 9,不同版本GCC对filesystem的链接要求存在差异:GCC 8以下版本使用std::filesystem需要额外链接
libstdc++fs库,GCC 9及以上版本已将filesystem纳入主标准库,无需额外链接
- 你提到的
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")行本身没有问题,不需要修改该行内容
解决步骤
方案一:修改CMakeLists.txt(推荐,永久生效)
找到CMakeLists.txt中对应的编译器配置段,替换为以下内容:
########################################################### #### Compiler configuration #### ########################################################### set(CMAKE_POSITION_INDEPENDENT_CODE ON) # enable -fPIC if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /MP") elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) # 明确指定C++17标准,覆盖原有失效的标准配置 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 适配低版本GCC的filesystem链接需求 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9) link_libraries(stdc++fs) endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic") endif() add_compile_options(-Werror)
修改完成后清空原有build缓存,重新执行编译流程:
cd ~/MMMCore rm -rf build mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc)
方案二:临时传递编译参数(无需修改项目文件)
直接在cmake阶段指定标准参数即可,无需修改CMakeLists.txt:
cd ~/MMMCore rm -rf build mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON .. make -j$(nproc)
内容的提问来源于stack exchange,提问作者Kong
相关产品推荐
相关产品推荐

