使用cmake构建包含“experimental/filesystem”库的项目

23

我需要在我的项目中添加一个“experimental/filesystem”头文件

#include <experimental/filesystem>
int main() {
    auto path = std::experimental::filesystem::current_path();
    return 0;
}

因此,我使用了-lstdc++fs标志,并与libstdc++fs.a进行了链接。

cmake_minimum_required(VERSION 3.7)
project(testcpp)
set(CMAKE_CXX_FLAGS "-std=c++14 -lstdc++fs" )
set(SOURCE_FILES main.cpp)
target_link_libraries(${PROJECT_NAME} /usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a)
add_executable(testcpp ${SOURCE_FILES})

然而,我遇到了下一个错误:

CMakeLists.txt:9行出现错误(target_link_libraries):无法为未由此项目构建的目标"testcpp"指定链接库。

但是,如果我直接编译,就没问题:

g++-7 -std=c++14 -lstdc++fs  -c main.cpp -o main.o
g++-7 -o main main.o /usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a

我的错误在哪里?

1个回答

29

只是 target_link_libraries() 调用必须在 add_executable() 调用之后。否则,testcpp 目标尚未知道。CMake 按顺序解析所有内容。

因此,为了完整起见,这是我测试过的您示例的可工作版本:

cmake_minimum_required(VERSION 3.7)

project(testcpp)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# NOTE: The following would add library with absolute path
#       Which is bad for your projects cross-platform capabilities
#       Just let the linker search for it
#add_library(stdc++fs UNKNOWN IMPORTED)
#set_property(TARGET stdc++fs PROPERTY IMPORTED_LOCATION "/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a")

set(SOURCE_FILES main.cpp)
add_executable(testcpp ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} stdc++fs)

4
这肯定不对。我们肯定不应该像那样硬编码库的位置。 - einpoklum
1
@einpoklum 你是正确的。我只是稍微优化了问题中给出的代码(并省略了那部分)。我今天稍后会更新我的回答以搜索库。 - Florian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接