![](/img/trans.png)
[英]Differences between c++14 std::experimental::filesystem::v1 and c++17 std::filesystem?
[英]How do I use cmake to ensure a C++14 compiler links with the experimental filesystem TS library?
我(切换到)在我的C ++ 14代码中使用<std::experimental::filesystem>
,并且我需要能够在Linux(以及任何启用了C ++ 14的版本)上使用GCC 5.x进行构建编译器,或者至少是相关版本的clang,msvc以及icc)。
现在,当我链接时,我收到有关丢失所有与文件系统相关的符号的错误,例如:
foo.cpp:(.text+0x9cd): undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
现在,如果我“手动”添加对libstdc++fs
的依赖关系:
target_link_libraries(foo other_lib stdc++fs)
然后一切都很好-但是如何将其推广到任何具有C ++ 14功能的编译器?
注意:我的CMakeLists.txt
的相关部分看起来像这样:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_library(bar src/bar.cpp)
add_executable(foo src/foo.cpp)
target_link_libraries(foo bar other_lib)
*(当我使用boost::filesystem
反而更容易-我只需要使用产生的任何FindBoost.cmake
。)
**对于其他编译器,使用-Wall
也是一个问题,我想。
不幸的是,这恰恰是打算使用的方式。 请参阅libstdc ++文档的相关部分 :
GCC 5.3包含由技术规范ISO / IEC TS 18822:2015定义的文件系统库的实现。 由于这是实验性库扩展,不是C ++标准的一部分, 因此在单独的库libstdc ++ fs.a中实现,并且没有共享库。 要使用该库,您应该包括-lstdc ++ fs并与之链接 。 在非POSIX平台上,库的实现不完整,特别是Windows支持是基本的。
由于文件系统库的实验性质,有关ABI稳定性和向后兼容性的通常保证不适用于它。 不保证任何标头中的组件在不同的GCC版本之间都将保持兼容。
(强调我的)
要仅在GCC下显式链接libstdc++fs
,可以使用相关的CMake变量 :
target_link_libraries(foo other_lib)
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU)
target_link_libraries(foo stdc++fs)
endif()
或者,以更奇特的方式
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU)
set(CXX_FILESYSTEM_LIBRARIES stdc++fs)
else()
set(CXX_FILESYSTEM_LIBRARIES)
endif()
target_link_libraries(foo other_lib ${CXX_FILESYSTEM_LIBRARIES})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.