cmake以源碼的方式引入第三方項目


最前

  • 本文將介紹一種以源碼的方式引入第三方庫的方法

准備

  • 主項目,需要引用第三方庫的某些函數
  • 第三方庫,以源碼的形式提供給主項目使用
  • 注意: 本文的背景:已經將第三方源碼下載好。

一個例子

我這里准備一個簡單的項目,調用第三方庫 fmt;其中fmt是以源碼的形式引入項目

  • cmake version: 3.17
  • platform: os X 10.15

目錄結構

.
├── build            # 存放cmake配置結果
├── cmake         # 自己寫的 .cmake 文件存放目錄
├── ext            # 第三方源碼存放目錄
│   ├── fmt      # fmt庫
│   └── spdlog-1.x  # spdlog庫
└── src      # 主項目的 .cc文件目錄

fmt.cmake 文件內容

spdlog與fmt庫都是第三方庫,本文只演示fmt庫。 fmt.cmake存放在cmake目錄下

include(FetchContent)

FetchContent_Declare(
    fmt 
    SOURCE_DIR ${PROJECT_SOURCE_DIR}/ext/fmt
)

FetchContent_GetProperties(fmt)
if (NOT fmt_POPULATED)
    FetchContent_Populate(fmt)
    # win:下面這行是將fmt添加到解決方案中
    add_subdirectory(${fmt_SOURCE_DIR} ${fmt_BINARY_DIR})
endif()

其中, FetchContent_Declare用法如下:

FetchContent_Declare(
    fmt             # 庫的名字
    SOURCE_DIR ${PROJECT_SOURCE_DIR}/ext/fmt            # 庫在本地的哪個目錄
)

回報根目錄下的 CMakeLists.txt

使用 include 包含庫 fmt 。

# 設置搜索路徑
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
# 包含目錄
include(fmt)

完整源碼

cmake_minimum_required(VERSION 3.17)

# ---------------------------------------------------------------------------------------------------
# 1. set name
project(demo_fp)

aux_source_directory( "${CMAKE_CURRENT_SOURCE_DIR}/src" src_cc)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
include(fmt)

if(fmt_FOUND)
    message(STATUS "1111 its not find fmt library- ------------")
else()
	message(STATUS "2222 its find fmt library- ------------")
	add_executable(${PROJECT_NAME})
	target_sources(${PROJECT_NAME} PUBLIC ${src_cc})
	target_link_libraries(${PROJECT_NAME} PUBLIC fmt::fmt)
	
endif(fmt_FOUND)

cmake配置結果

轉到 build 目錄,執行cmake .. , 結果:

再執行命令: make 即可得到結果

well done.

src/main.cc內容

根目錄 src下的main.cc文件內容

#ifdef _WIN32
#pragma once
#endif 

#include <fmt/format.h>
#include <iostream>
int main(int argc, char* argv[], char* env[])
{
    std::string str = fmt::format("{0} + {1} = {2}", 1, 2, 3);
    std::cout << "str=" << str.c_str() << "\n\n";

    return 0;
}

可執行程序運行結果


免責聲明!

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



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