使用C++20的filesystem时,仍需链接stdc++fs库吗?
关于g++9下
experimental::filesystem是否需要链接stdc++fs的问题 好问题!结合你使用的g++-9(9.3.0)和CMake 3.16版本,我来给你拆解清楚:
为什么现在不用链接也能编译通过?
在g++ 9及更高版本中,当你启用C17或更高标准时,experimental::filesystem(以及正式的std::filesystem)的实现已经被整合进默认的libstdc++主库中了,不再需要依赖单独的stdc++fs库。这是GCC团队在g9版本做出的调整——之前的g8及更早版本,即使开启C17,filesystem相关的组件还是作为独立库发布,必须显式链接才能避免未定义引用错误。省略链接命令会不会有问题?
完全不会,反而更推荐你省略这条命令。原因有两个:- 对于你的g++9版本来说,
stdc++fs库要么已经是空的,要么其内容和主库完全重复,链接它不会带来任何好处,纯粹是做无用功; - 未来如果升级编译器版本,这条多余的链接指令可能会引发不必要的警告(甚至极端情况下的冲突,不过概率极低)。
- 对于你的g++9版本来说,
有没有需要注意的例外情况?
如果你不小心将CMake的C标准设置为C14或更低,同时仍在使用experimental::filesystem,那还是需要链接stdc++fs的。但从你的描述来看,你现在不用链接也能编译通过,说明你的项目肯定已经启用了C++17及以上标准,所以这个情况对你不适用。
总结一下:针对你的环境,删掉target_link_libraries(MyTarget stdc++fs)完全安全,而且是更简洁的正确做法。
内容的提问来源于stack exchange,提问作者Hirek
相关产品推荐
相关产品推荐

