【问题标题】:Build project with "experimental/filesystem" using cmake使用 cmake 构建具有“实验性/文件系统”的项目
【发布时间】:2017-11-12 14:15:39
【问题描述】:

我需要在我的项目中添加一个“实验/文件系统”标头

#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) 处的 CMake 错误:不能 为不是由
构建的目标“testcpp”指定链接库 这个项目。

但是如果我直接编译就OK了:

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

我的错误在哪里?

【问题讨论】:

    标签: c++ cmake c++14


    【解决方案1】:

    只是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)
    

    【讨论】:

    • 这不可能。当然,我们不应该像那样对库位置进行硬编码。
    • @einpoklum 你是对的。我只是稍微优化了问题中的给定代码(并省略了那部分)。我将在今天晚些时候更新我的答案以搜索图书馆。
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多