所以我一直在尝试将其<filesystem>纳入我的项目中,这似乎是一个比我想象的更大的问题. <filesystem>应该是c ++ 17的一部分,我需要将该定义添加到我的CMakeList中.
我的根CmakeLists看起来像这样:
MESSAGE(“In src CMAKELIST”)
#
# Build everything in include/ directory
add_subdirectory(include)
#
#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
## Main executable target
add_executable(cmakeDemo main.cpp)
# These libraries get built in include/*/, CMake will auto-set required
# compiler flags and include paths from their definitions
target_link_libraries(cmakeDemo record ${portaudio})
target_link_libraries(cmakeDemo database)
target_link_libraries(cmakeDemo match)
target_link_libraries(cmakeDemo spectogram)
Run Code Online (Sandbox Code Playgroud)
我在其中添加了c ++ 17定义,但是当我编译系统时,我收到此错误:
make
“InsrcCMAKELIST”
“InincludeCMAKELIST”
“IndatabaseCMAKELIST”
“InmatchCMAKELIST”
“InrecordCMAKELIST”
“InspectogramCMAKELIST”
/home/lamda/soundcloud/src/include/spectogram/base/base.h
“outspectogramCMAKELIST”
-- Configuring done
CMake Error in src/CMakeLists.txt:
Target "cmakeDemo" requires the language dialect "CXX17" (with compiler
extensions), but CMake does not know the compile flags to use to enable it.
-- Generating done
-- Build files have been written to: /home/lamda/soundcloud/build
make: *** [cmake_check_build_system] Error 1
Run Code Online (Sandbox Code Playgroud)
但不知何故不是它愿意使用c ++ 17,所以我可以使用这个filesystem库吗?为什么?
我正面临着同样的问题,但如果答案是一个好的开始,那还不够(至少对我而言)。
所以在这里我如何修复它(在centos7发行版上)
在 centos 上'sudo yum info cmake'说'2.8.12'
所以我不得不遵循这些说明:https : //cmake.org/download/实际上以一个'3.14.5'版本结束
正如@Lamda 提到的,工具链需要更新,
否则你仍然会停留在完全相同的错误消息上。
以下是 CMAKE 检查支持的方言的方式:https : //github.com/Kitware/CMake/blob/master/Modules/Compiler/GNU-CXX.cmake#L45
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z")
set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
endif()
Run Code Online (Sandbox Code Playgroud)
再说一次,centos 没有运气,'sudo yum info gcc'说'4.8.5'
我决定直接从源代码编译 GCC,如下所示:
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z")
set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
endif()
Run Code Online (Sandbox Code Playgroud)
因此我以 GCC 7.2.0 结束。
如果成功,下面的测试应该返回 201402L
wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-7.2.0/gcc-7.2.0.tar.gz
tar -xvzf gcc-7.2.0.tar.gz
cd gcc-7.2.0
./contrib/download_prerequisites
./configure \
--enable-bootstrap \
--enable-languages=c,c++,fortran,lto \
--with-bugurl=http://bugzilla.redhat.com/bugzilla \
--enable-shared \
--enable-threads=posix \
--enable-checking=release \
--disable-multilib \
--with-system-zlib \
--enable-__cxa_atexit \
--disable-libunwind-exceptions \
--enable-gnu-unique-object \
--enable-linker-build-id \
--with-gcc-major-version-only \
--enable-plugin \
--with-linker-hash-style=gnu \
--enable-initfini-array \
--enable-libmpx \
--enable-gnu-indirect-function \
--with-tune=generic \
--build=x86_64-redhat-linux
make -j4
sudo make install
sudo sh -c 'echo /usr/local/lib > /etc/ld.so.conf.d/1-gcc.conf'
sudo sh -c 'echo /usr/local/lib64 >> /etc/ld.so.conf.d/1-gcc.conf'
sudo ldconfig -v
Run Code Online (Sandbox Code Playgroud)
就我而言,还需要其他一些东西才能使其正常工作:
g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
Run Code Online (Sandbox Code Playgroud)
为什么?你可能会问...
GCC.7.2.0 实际上似乎没有附带'cc' (这应该是微不足道的符号链接'gcc')
另一方面,CMAKE'g++'通过使用'cc'路径(作为提示)确定路径
就我而言,我仍然有一个/bin/cc #4.8.5和/bin/g++ #4.8.5
所以即使/usr/local/bin/g++ #7.2.0现在存在(应该在之前使用)
不幸的是,CMAKE 将/bin/g++ #4.8.5改为使用
但是,显然最佳实践是删除整个旧的 GCC 工具链。