用于克服libstdc ++文件系统怪异的CMake习惯用法?

问题描述 投票:0回答:1

如果您使用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 c++14 linker-errors libstdc++ std-filesystem
1个回答
0
投票

tl; dr:现在什么都没有,请等待更新的CMake或使用G ++ 9.x

正如@Pedro亲切地指出的,这是一个已知的问题,在KitWare的CMake的GitLab站点上有一个open issue

C ++ 17 std :: filesystem的便携式链接

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

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

幸运的是,对于GCC 9,[​​C0]已合并到libstdc++fs中,因此,如果您使用的是g ++ 9或更高版本,则您将不再遇到此问题,即它将在较新的平台上消失。

© www.soinside.com 2019 - 2024. All rights reserved.