1. 程式人生 > 實用技巧 >cmake之引入外部專案(引用其他專案)、FetchContent管理子模組

cmake之引入外部專案(引用其他專案)、FetchContent管理子模組

本文CMAKE版本為3.18

1. 關於

截至目前,我知道的,有兩種方式引入外部專案
A. git下的Submodle
使用命令可以將克隆的專案新增到當前專案,作為子專案使用,比如,fmt庫為例:

git submodule add https://gitee.com/mohistH/fmt.git

如果Submodle不熟悉?請參考官方文件

B. cmake的FetchContent
本文將側重介紹這種方式 ,至於具體需要怎麼使用FetchContent,這裡就不重複了,請參考官方文件

2. FetchContent的一個簡單例子

這裡,以下載spdlog庫作為專案的子模組使用,直接將下載子模組的程式碼配置寫到了top directory

下的CMakeLists.txt

  • 2.1 目錄結構
.
├───build		# cmake的輸出檔案
├───ext		# spdlog等第三方庫的存放目錄
├───include		# 標頭檔案路徑
├───src		# 原始檔路徑
└───CMakeLists.txt # top directory下的cmake配置檔案
  • 2.2 top directory下的cmake配置檔案CMakeLists.txt檔案原始碼
cmake_minimum_required(VERSION 3.18)

project(spdlog_demo VERSION 1.0.1)

# 因為spdlog是基於c++11的庫
set(CMAKE_CXX_STANDARD 11)

# 指定原始檔
set(src_file 
	${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc
)

# 建立可執行程式專案
add_executable(spdlog_demo ${src_file} )
# 指定標頭檔案路徑
target_include_directories(spdlog_demo PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/)
# 指定lib檔案路徑
target_link_libraries(	spdlog_demo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

# fetchcontent重點來了
#-------------------------------------------------------------------
include(fetchcontent)      # 照寫,不需要修改
 fetchcontent_declare(	spdlog	#庫名字
						GIT_REPOSITORY https://gitee.com/mohistH/spdlog.git	# 倉庫地址
						GIT_TAG v1.x # 庫版本
						SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ext/spdlog # 指定庫下載地址
						)

fetchcontent_makeavailable(spdlog)

# 專案中使用spdlog
target_link_libraries(spdlog_demo PRIVATE spdlog::spdlog)
#-------------------------------------------------------------------

這裡建立了一個專案spdlog_demo,該專案引用了子模組spdlog,本地沒有spdlog,上面的程式碼中則是在呼叫cmakelists.txt的時候下載spdlog的原始碼

  • 2.3 轉到build目錄,使用cmake .. , 就開始配置專案了,並下載原始碼spdlog, 將spdlog的原始碼放到了top directory下的ext資料夾下。

參考