我试图使用包含的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()
函数使用一些我不知道的魔术吗?
答案 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