如果您使用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})
但是-我不喜欢将这段代码放在我从事的每个项目中。我可以使用更简单或更标准的习惯用法吗?某种方式这也许会隐式发生?
tl; dr:现在什么都没有,请等待更新的CMake或使用G ++ 9.x
正如@Pedro亲切地指出的,这是一个已知的问题,在KitWare的CMake的GitLab站点上有一个open issue:
C ++ 17 std :: filesystem的便携式链接
[如果使用
CMAKE_CXX_STANDARD=17
和std::filesystem
,则GCC需要链接一个额外的库:stdc++fs
。 ...如果启用了C ++ 17,是否值得自动链接到需要此功能的GCC版本的stdc ++ fs?同样,对于其他编译器或库中的任何怪癖。
KitWare问题与C ++ 17有关,显然,您仍然需要单独的额外库(即,这不仅是因为C ++ 14中的“实验性”)。希望我们会在这件事上看到一些牵引力-但
幸运的是,对于GCC 9,[C0]已合并到libstdc++fs
中,因此,如果您使用的是g ++ 9或更高版本,则您将不再遇到此问题,即它将在较新的平台上消失。