为什么link_libraries(stdc ++ fs)可以工作,但-lstdc ++ fs不能工作?

时间:2018-12-16 11:03:23

标签: c++ cmake g++ c++17

我试图使用包含的CMake / g ++ 8.1在Ubuntu上编译C ++ 17程序

#include <filesystem>

当我使用这个

set(CMAKE_CXX_FLAGS "-lstdc++fs")

我有一个奇怪的链接器错误

undefined reference to `std::filesystem::__cxx11::recursive_directory_iterator::~recursive_directory_iterator()'

当我尝试使用-lstdc++fs标志手动调用g ++时,也会出现此错误。

另一方面,这行符合我的预期

link_libraries(stdc++fs)

我很好奇为什么这两行提供不同的结果。 link_libraries()函数使用一些我不知道的魔术吗?

1 个答案:

答案 0 :(得分:4)

这会更改编译器标志,但不会更改链接标志:

set(CMAKE_CXX_FLAGS "-lstdc++fs")

这意味着编译文件时,添加的库没有任何作用,然后链接创建可执行文件时,不要获得此标志。

因此,您实际上应该使用以下方式更改链接器:

target_link_libraries(target PRIVATE stdc++fs)

代替link_libraries(这是旧式CMake,不适合处理多个目标)。

建议使用

target_link_libraries,因为它只会将库添加到target中。 PRIVATE还指示不传播共享库的链接(即从属库将不会针对stdc++fs进行链接)。

您可以通过以下方法检查两者之间的行为差​​异:

VERBOSE=1 make