我正在尝试使用 experimental / filesystem 。
我首先尝试通过CMake直接在我的项目中使用它,添加:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lstdc++fs")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lstdc++fs")
这不起作用,引发了一个长而难以阅读的错误:
CMakeFiles/miner.dir/Main.cpp.o: In function `main':
Main.cpp:(.text+0x33): undefined reference to `std::experimental::filesystem::v1::create_directories(std::experimental::filesystem::v1::__cxx11::path const&)'
CMakeFiles/miner.dir/Main.cpp.o: In function `std::experimental::filesystem::v1::__cxx11::path::path<char [6], std::experimental::filesystem::v1::__cxx11::path>(char const (&) [6])':
Main.cpp:(.text._ZNSt12experimental10filesystem2v17__cxx114pathC2IA6_cS3_EERKT_[_ZNSt12experimental10filesystem2v17__cxx114pathC5IA6_cS3_EERKT_]+0x73): undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
CMakeFiles/miner.dir/build.make:123: recipe for target 'miner' failed
make[2]: *** [miner] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/miner.dir/all' failed
make[1]: *** [CMakeFiles/miner.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
无论如何,我不确定为什么会发生这种情况,直到我意识到由于某种原因 - 与 filesystem 是一个静态库有关 - 我需要-lstdc++11
就在命令的最后。
我用一个小文件测试了它,只包含<experimental/filesystem>
并制作了一些目录(代码并不重要)。
我使用这些命令构建它:
g++ -c test.cpp -lstdc++fs
g++ -o test test.o -lstdc++fs
这很有用。因此,我确信我认为-lstdc++fs
必须遵循命令的其余部分才是正确的。
然后我在我的大型CMake项目中使用了make VERBOSE=1
,并注意到它正在执行我想要的相反:它将-lstdc++fs
放在开始命令!
我确信CMake比我知道它做得更多,这让我相信我做错了什么。 有没有办法使用experimental/filesystem
而不将标志放在命令的末尾?如果没有更好的方法,那么我希望CMake有办法做到这一点。 / p>
答案 0 :(得分:4)
如果你想链接到一个图书馆,请告诉CMake,并且不要弄乱旗帜,就CMake而言,这些旗帜是黑匣子。只需这样做:
target_link_libraries(YourExeTarget stdc++fs)