• cmake调用第三方库


    目录

    • 代码依赖
      • 自己写的工程,非第三方工程
      • 引入他人的第三方代码库,独立的库
    • 目标文件依赖
      • jsoncpp工程,生成lib库
      • main.cpp工程
    • find_package
    • fetchContent
    • CPM
    • git submodule

    代码依赖

    自己写的工程,非第三方工程

    • 工程目录
    1. ├── 3rdparty
    2. │   └── jsoncpp
    3. │   ├── include
    4. │   └── src
    5. ├── build
    6. ├── CMakeLists.txt
    7. └── main.cpp
    • CMakeLists.txt
    1. cmake_minimum_required(VERSION 3.11)
    2. project(cmake_3rd)
    3. set(CMAKE_CXX_STANDARD 17)
    4. set(SRC_MAIN main.cpp)
    5. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)
    6. aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/src jsoncpp)
    7. add_executable(main ${SRC_MAIN} ${jsoncpp})
    • main.cpp
    1. #include
    2. #include "json/json.h"
    3. int main(int argc, char const *argv[])
    4. {
    5. Json::Value json;
    6. json["name"] = "wiki";
    7. json["age"] = 18;
    8. std::cout << json.toStyledString() << std::endl;
    9. return 0;
    10. }

    引入他人的第三方代码库,独立的库

    • 工程目录
    1. ├── 3rdparty
    2. │   └── jsoncpp
    3. │   ├── CMakeLists.txt
    4. │   ├── include
    5. │   └── src
    6. ├── build
    7. ├── CMakeLists.txt
    8. └── main.cpp
    • 3rdparty/jsoncpp/CMakeLists.txt
    1. project(jsoncpp)
    2. aux_source_directory(./src SRC_JSONCPP)
    3. add_library(jsoncpp ${SRC_JSONCPP})
    • CMakeLists.txt
    1. cmake_minimum_required(VERSION 3.11)
    2. project(cmake_3rd)
    3. set(CMAKE_CXX_STANDARD 17)
    4. set(SRC_MAIN main.cpp)
    5. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)
    6. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp)
    7. add_executable(main ${SRC_MAIN})
    8. target_link_libraries(main jsoncpp)

    目标文件依赖

    jsoncpp工程,生成lib库

    • 过程目录
    1. ├── build
    2. ├── CMakeLists.txt
    3. ├── include
    4. │   └── json
    5. │   ├── allocator.h
    6. │   ├── assertions.h
    7. │   ├── autolink.h
    8. │   ├── config.h
    9. │   ├── features.h
    10. │   ├── forwards.h
    11. │   ├── json.h
    12. │   ├── reader.h
    13. │   ├── value.h
    14. │   ├── version.h
    15. │   └── writer.h
    16. └── src
    17. ├── json_reader.cpp
    18. ├── json_tool.h
    19. ├── json_value.cpp
    20. ├── json_valueiterator.inl
    21. ├── json_writer.cpp
    22. └── version.h.in
    • CMakeLists.txt
    1. cmake_minimum_required(VERSION 3.11)
    2. project(jsoncpp)
    3. include_directories(${PROJECT_SOURCE_DIR}/include)
    4. aux_source_directory(./src SRC_JSONCPP)
    5. add_library(lib_jsoncpp_static STATIC ${SRC_JSONCPP})
    6. add_library(lib_jsoncpp_dynamic SHARED ${SRC_JSONCPP})
    7. set_target_properties(lib_jsoncpp_static PROPERTIES OUTPUT_NAME "jsoncpp")
    8. set_target_properties(lib_jsoncpp_dynamic PROPERTIES OUTPUT_NAME "jsoncpp")
    9. set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

    将jsoncpp/build/lib文件夹拷贝到使用者目录(main.cpp所在目录的build目录下)

    main.cpp工程

    • 工程目录
    1. ├── 3rdparty
    2. │   └── jsoncpp
    3. │   └── include
    4. ├── build
    5. │   ├── lib
    6. │   │   ├── libjsoncpp.a
    7. │   │   └── libjsoncpp.so
    8. ├── CMakeLists.txt
    9. └── main.cpp
    • 方法1:CMakeLists.txt
    1. cmake_minimum_required(VERSION 3.11)
    2. project(cmake_3rd)
    3. set(CMAKE_CXX_STANDARD 17)
    4. set(SRC_MAIN main.cpp)
    5. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)
    6. link_directories(${PROJECT_BINARY_DIR}/lib)
    7. add_executable(main ${SRC_MAIN})
    8. target_link_libraries(main libjsoncpp.a)

    ​ - link_directories:执行后可以链接该目录下的多个库文件

    • 方法2:CMakeLists.txt
    1. cmake_minimum_required(VERSION 3.11)
    2. project(cmake_3rd)
    3. set(CMAKE_CXX_STANDARD 17)
    4. set(SRC_MAIN main.cpp)
    5. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)
    6. add_executable(main ${SRC_MAIN})
    7. find_library(lib_jsoncpp NAMES libjsoncpp.so PATHS ${PROJECT_BINARY_DIR}/lib)
    8. target_link_libraries(main ${lib_jsoncpp})

    ​ - find_library:执行后,只能使用该库(如果工程需要链接其他目标,则需要再次find_library)

    cmake调用第三方库 | 程序员灯塔

  • 相关阅读:
    MySQL分布式事务xa的介绍与使用
    广州穗雅医院健康小贴士:秋冬季节唇炎防护指南
    ABP +VUE Elment 通用高级查询(右键菜单)设计+LINQ通用类Expression<Func<TFields, bool>>方法
    计算机毕业设计node.js+vue+Element企业员工信息管理系统
    cewl工具(URL字典生成器)
    【羊了个羊】什么!第二关难如上青天,能不能简单版??
    从react源码看hooks的原理
    我在高职教STM32——GPIO入门之按键输入(1)
    ubuntu下安装nginx服务
    Python算法——最近公共祖先
  • 原文地址:https://blog.csdn.net/qixiang2013/article/details/126021728