所以我一直试图将<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)
我在其中添加了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
但不知何故它不愿意使用c ++ 17,所以我可以使用filesystem
库吗?为什么呢?
答案 0 :(得分:8)
答案 1 :(得分:1)
我也面临着同样的问题,但是如果答案是一个好的开始,那还不够(至少对我而言)。
这就是我的解决方法(在 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()
同样,'sudo yum info gcc'
说'4.8.5'
我决定直接使用以下代码从源代码编译GCC:
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
因此,我以GCC 7.2.0结尾。
如果成功,则以下测试应返回201402L
g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
就我而言,需要其他一些措施才能使其起作用:
sudo ln -s /usr/local/bin/gcc /usr/local/bin/cc
为什么?你可能会问...
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工具链。
答案 2 :(得分:0)
从源头构建我们自己的GCC实际上是一个坏主意...
就我而言,尝试与外部库(即使使用相同的c ++标准版本/ GCC版本制作)链接也遇到了一些错误
最佳做法似乎是使用 devtoolset yum包 https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/
看来,此软件包是通过为您提供一些Redhat补丁和一个configure开关而制成的。因此,到目前为止,我们还不知道使它正常工作的神奇方法,而使用更正式的方法则是有意义的。
结论: 请改用devtoolset yum包,或尝试从源代码编译GCC