cmake調用第三方庫


代碼依賴

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

  • 工程目錄
├── 3rdparty
│   └── jsoncpp
│       ├── include
│       └── src
├── build
├── CMakeLists.txt
└── main.cpp
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.11)

project(cmake_3rd)
set(CMAKE_CXX_STANDARD 17)

set(SRC_MAIN main.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/src jsoncpp)
add_executable(main ${SRC_MAIN} ${jsoncpp})
  • main.cpp
#include <iostream>
#include "json/json.h"

int main(int argc, char const *argv[])
{
    Json::Value json;
    json["name"] = "wiki";
    json["age"] = 18;
    std::cout << json.toStyledString() << std::endl;
    return 0;
}

引入他人的第三方代碼庫,獨立的庫

  • 工程目錄
├── 3rdparty
│   └── jsoncpp
│       ├── CMakeLists.txt
│       ├── include
│       └── src
├── build
├── CMakeLists.txt
└── main.cpp
  • 3rdparty/jsoncpp/CMakeLists.txt
project(jsoncpp)
aux_source_directory(./src SRC_JSONCPP)
add_library(jsoncpp ${SRC_JSONCPP})
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.11)

project(cmake_3rd)

set(CMAKE_CXX_STANDARD 17)

set(SRC_MAIN main.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp)

add_executable(main ${SRC_MAIN})
target_link_libraries(main jsoncpp)

目標文件依賴

jsoncpp工程,生成lib庫

  • 過程目錄
├── build
├── CMakeLists.txt
├── include
│   └── json
│       ├── allocator.h
│       ├── assertions.h
│       ├── autolink.h
│       ├── config.h
│       ├── features.h
│       ├── forwards.h
│       ├── json.h
│       ├── reader.h
│       ├── value.h
│       ├── version.h
│       └── writer.h
└── src
    ├── json_reader.cpp
    ├── json_tool.h
    ├── json_value.cpp
    ├── json_valueiterator.inl
    ├── json_writer.cpp
    └── version.h.in

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(jsoncpp)

include_directories(${PROJECT_SOURCE_DIR}/include)
aux_source_directory(./src SRC_JSONCPP)
add_library(lib_jsoncpp_static STATIC ${SRC_JSONCPP})
add_library(lib_jsoncpp_dynamic SHARED ${SRC_JSONCPP})

set_target_properties(lib_jsoncpp_static PROPERTIES OUTPUT_NAME "jsoncpp")
set_target_properties(lib_jsoncpp_dynamic PROPERTIES OUTPUT_NAME "jsoncpp")

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

將jsoncpp/build/lib文件夾拷貝到使用者目錄(main.cpp所在目錄的build目錄下)

main.cpp工程

  • 工程目錄
├── 3rdparty
│   └── jsoncpp
│       └── include
├── build
│   ├── lib
│   │   ├── libjsoncpp.a
│   │   └── libjsoncpp.so
├── CMakeLists.txt
└── main.cpp

  • 方法1:CMakeLists.txt
cmake_minimum_required(VERSION 3.11)

project(cmake_3rd)

set(CMAKE_CXX_STANDARD 17)

set(SRC_MAIN main.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)

link_directories(${PROJECT_BINARY_DIR}/lib)
add_executable(main ${SRC_MAIN})
target_link_libraries(main libjsoncpp.a)

​ - link_directories:執行后可以鏈接該目錄下的多個庫文件

  • 方法2:CMakeLists.txt
cmake_minimum_required(VERSION 3.11)

project(cmake_3rd)

set(CMAKE_CXX_STANDARD 17)

set(SRC_MAIN main.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include)

add_executable(main ${SRC_MAIN})
find_library(lib_jsoncpp NAMES libjsoncpp.so PATHS ${PROJECT_BINARY_DIR}/lib)
target_link_libraries(main ${lib_jsoncpp})

​ - find_library:執行后,只能使用該庫(如果工程需要鏈接其他目標,則需要再次find_library)

find_package

  • 工程目錄
├── build
├── CMakeLists.txt
└── main.cpp
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.11)

project(cmake_3rd)

set(CMAKE_CXX_STANDARD 17)

set(SRC_MAIN main.cpp)

find_package(Boost COMPONENTS atomic REQUIRED)

if (Boost_FOUND)
    message("Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
    message("Boost_LIBRARIES = ${Boost_LIBRARIES}")
    message("Boost_VERSION = ${Boost_VERSION}")

    include_directories(${Boost_INCLUDE_DIRS})

    add_executable(main ${SRC_MAIN})
    target_link_libraries(main ${Boost_LIBRARIES})
endif()
  • main.cpp
#include <iostream>
#include "boost/atomic.hpp"

int main(int argc, char const *argv[])
{
    boost::atomic_bool b = true;
    std::cout << b << std::endl;
    return 0;
}

fetchContent

CPM

git submodule


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM