#c #makefile #cmake #std-filesystem
Вопрос:
Я пытаюсь установить MMMTools https://mmm.humanoids.kit.edu/installation.html. Моя версия cmake-3.16.3. Я прошел каждый шаг без каких-либо ошибок до этого раздела
cd ~/MMMCore
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
make
Команда возвращает мне следующую ошибку.
(base) kong@kong-Standard:~/MMMCore/build$ make
[ 1%] Building CXX object CMakeFiles/MMMCore.dir/MMM/XMLTools.cpp.o
/home/kong/MMMCore/MMM/XMLTools.cpp: In function ‘void MMM::XML::makeAbsolutePath(const stringamp;, std::stringamp;)’:
/home/kong/MMMCore/MMM/XMLTools.cpp:650:64: error: ‘operator/’ is not a member of ‘std::filesystem’; did you mean ‘operator~’?
650 | std::filesystem::path filenameNewComplete = std::filesystem::operator/(filenameBasePath, filenameNew);
| ^~~~~~~~~
| operator~
make[2]: *** [CMakeFiles/MMMCore.dir/build.make:76: CMakeFiles/MMMCore.dir/MMM/XMLTools.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:295: CMakeFiles/MMMCore.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
Но я погуглил функцию и увидел, что она является членом файловой системы std::https://en.cppreference.com/w/cpp/filesystem/path/operator_slash. Что пошло не так?
Я просмотрел 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)
# cmake 3.10 does not understand c 2a, so we tell it we will handle the standard flag
set(CMAKE_CXX_STANDARD_DEFAULT)
add_definitions(-std=c 2a)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()
add_compile_options(-Werror)
Я компилирую его на Ubuntu 20.04, так что, думаю, он входит в раздел elseif. Означает ли это, что он не использует C 17? Нужно ли мне редактировать строку set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
, чтобы она использовала C 17?
В руководстве указано, что это для 18.04, но поскольку проблема связана с C 17, я не думаю, что ошибка заключается в использовании 20.04?
Комментарии:
1.
operator/
является участникомstd::filesystem
с C 17. Какой стандарт указан в файле makefile?2. @Chris Я обновил свой пост, включив в него раздел из CMakeLists.txt это определяет компилятор. Нужно ли мне менять его на C 17? Я новичок в CMake.
3. Изложение
std::filesystem::operator/(filenameBasePath, filenameNew)
поражает цельoperator/
. Один из них должен использоватьсяfilenameBasePath/filenameNew
. Просто говорю.
Ответ №1:
Из-за LWG 3065 оператор теперь скрыт и не должен вызываться напрямую.
std::filesystem::path filenameNewComplete = std::filesystem::operator/(filenameBasePath, filenameNew);
Должно быть просто:
std::filesystem::path filenameNewComplete = filenameBasePath / filenameNew;
Я предполагаю, что код был протестирован только на более старой реализации (похоже, что это было реализовано в gcc/libstdc 9), чем та, которую вы используете, хотя я не знаю, почему изначально он был написан таким сложным способом.
Комментарии:
1. Вы показываете декларацию
std::filesystem::operator/
, членом которой явно являетесьstd::filesystem
. Он возвращаетstd::filesystem::path
, что является типом.2. @n.1.8e9-где-моя-доля. исправлено