首页 > 解决方案 > 用于克服 libstdc++ 文件系统怪异的 CMake 习语?

问题描述

如果您使用 G++ 和 libstdc++ 构建 C++14 代码,则有一个名为 的库libstdc++fs,它libstdc++std::experimental::filesystem. 如果您不链接它,您将获得未定义的引用。

我现在用来克服这个问题的“技巧”是:

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
        set(CXX_FILESYSTEM_LIBRARIES "stdc++fs")
endif()

然后:

target_link_libraries(my_target PUBLIC ${CXX_FILESYSTEM_LIBRARIES})

但是 - 我不喜欢在我从事的每个项目中都放置这段代码。我可以使用更简单或更标准的成语吗?以某种方式,这一切可能都会隐含地发生,有一些 CMake 的幕后魔法?

标签: cmakec++14linker-errorslibstdc++std-filesystem

解决方案


tl;博士:现在什么都没有,等待更新的 CMake 版本

正如@Pedro 亲切地指出的那样,这是一个已知问题,在 KitWare 的 GitLab 站点上针对 CMake存在一个未解决的问题:

C++17 std::filesystem 的可移植链接

如果使用CMAKE_CXX_STANDARD=17and std::filesystem,GCC 需要链接一个额外的库:stdc++fs. ...如果启用了 C++17,是否值得为需要此功能的 GCC 版本自动链接到 stdc++fs?对于其他编译器或库中的任何怪癖也是如此。

KitWare 问题与 C++17 有关,显然您仍然需要单独的额外库(即,这不仅仅是因为 C++14 中的“实验性”)。希望我们能在这个问题上看到一些牵引力——但是

注意:如果您在使用 C++17 时遇到此问题std::filesystem,那么您很幸运 - 该代码是libstdc++从 GCC 9 开始内置的,因此如果您使用的是 g++ 9 或更高版本,并且std::filesystem您应该不会再遇到这种情况问题。


推荐阅读