cmake - 用于克服 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 的幕后魔法?
解决方案
tl;博士:现在什么都没有,等待更新的 CMake 版本
正如@Pedro 亲切地指出的那样,这是一个已知问题,在 KitWare 的 GitLab 站点上针对 CMake存在一个未解决的问题:
C++17 std::filesystem 的可移植链接
如果使用
CMAKE_CXX_STANDARD=17
andstd::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
您应该不会再遇到这种情况问题。
推荐阅读
- drake - 德雷克可视化器不显示任何内容
- python - 使用 agg 函数时的 pandas valueError
- java - Java 不能用不同的参数继承
- angular - Angular 7:选择选项值被解析为“[index]:[value]”
- java - How can I correct this int to boolean error?
- dart - What IOS version Flutter Ffmpeg at least
- java - Why Java doesn't implement MRO like Python
- c - C中的二维结构数组??(也许)
- java - Tomcat 9.0.16 Java 11 HTTP/2
- flutter - 如何从文档快照中获取 Firestore 文档 ID?