最前
- 本文將介紹一種以源碼的方式引入第三方庫的方法
准備
- 主項目,需要引用第三方庫的某些函數
- 第三方庫,以源碼的形式提供給主項目使用
- 注意: 本文的背景:已經將第三方源碼下載好。
一個例子
我這里准備一個簡單的項目,調用第三方庫 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;
}