浙江省住房和城鄉(xiāng)建設(shè)廳網(wǎng)站 文件信息流廣告文案
CMake 引入第三方庫(kù)
在 CMake 中,如何引入第三方庫(kù)是一個(gè)常見(jiàn)的問(wèn)題。在本文中,我們將介紹 CMake 中引入第三方庫(kù)的不同方法,以及它們的優(yōu)缺點(diǎn)。
1. 使用 find_package 命令
在 CMake 中,使用 find_package 命令是最簡(jiǎn)單和最常用的方式來(lái)引入已安裝的外部庫(kù)。例如,我們可以使用以下命令來(lái)引入 OpenSSL 庫(kù):
find_package(OpenSSL REQUIRED)
在這個(gè)例子中,CMake 將查找已安裝的 OpenSSL 庫(kù),并將其鏈接到我們的項(xiàng)目中。當(dāng)然,我們也可以通過(guò)設(shè)置變量來(lái)指定 OpenSSL 的路徑:
set(OPENSSL_ROOT_DIR /path/to/openssl)
find_package(OpenSSL REQUIRED)
使用 find_package 命令的主要優(yōu)點(diǎn)是它能夠自動(dòng)查找和鏈接已經(jīng)安裝的庫(kù),這使得構(gòu)建過(guò)程更加簡(jiǎn)單和直觀(guān)。
2. 使用 add_subdirectory 命令
在某些情況下,我們可能需要修改外部庫(kù)的源代碼。此時(shí),我們可以將外部庫(kù)的源代碼添加到我們的項(xiàng)目中,然后使用 add_subdirectory 命令來(lái)構(gòu)建外部庫(kù)。例如,我們可以使用以下命令來(lái)引入 JsonCpp 庫(kù):
add_subdirectory(/path/to/jsoncpp)
target_link_libraries(myapp PRIVATE jsoncpp_lib)
在這個(gè)例子中,我們將 JsonCpp 庫(kù)的源代碼添加到我們的項(xiàng)目中,并將 jsoncpp_lib 目標(biāo)鏈接到我們的應(yīng)用程序中。在構(gòu)建我們的項(xiàng)目時(shí),CMake 將自動(dòng)構(gòu)建 JsonCpp 庫(kù),并將其鏈接到我們的應(yīng)用程序中。
使用 add_subdirectory 命令的主要優(yōu)點(diǎn)是,它能夠更方便地管理外部庫(kù)的源代碼。我們可以將外部庫(kù)的源代碼包含在我們的版本控制系統(tǒng)中,以便更好地管理和維護(hù)代碼。但是,使用此方法需要手動(dòng)管理外部庫(kù)的源代碼,因此更新可能會(huì)導(dǎo)致您的項(xiàng)目中出現(xiàn)構(gòu)建問(wèn)題。
3. 使用 ExternalProject_Add 命令
下面是一個(gè)使用 ExternalProject_Add 命令下載和構(gòu)建 Google Test 庫(kù)的例子。在這個(gè)例子中,我們將下載 Google Test 庫(kù)的源代碼,并將其作為獨(dú)立項(xiàng)目構(gòu)建。使用 ExternalProject_Add 命令的主要優(yōu)點(diǎn)在于,它能夠?qū)⑼獠宽?xiàng)目的構(gòu)建過(guò)程與主項(xiàng)目的構(gòu)建過(guò)程隔離開(kāi)來(lái),從而更加靈活地控制外部項(xiàng)目的行為和依賴(lài)關(guān)系。
cmake_minimum_required(VERSION 3.11)include(ExternalProject)# 設(shè)置下載的 URL 和 SHA-256 哈希值
set(GTEST_VERSION "1.11.0")
set(GTEST_URL "https://github.com/google/googletest/archive/refs/tags/release-${GTEST_VERSION}.tar.gz")
set(GTEST_HASH "d722feaac7d6b2270c2f6896d364c3712cf18e9cd963c1e7f56c38e936e13fa1")# 下載和解壓 Google Test 庫(kù)的源代碼
ExternalProject_Add(googletestPREFIX "${CMAKE_CURRENT_BINARY_DIR}/googletest"URL "${GTEST_URL}"URL_HASH SHA256=${GTEST_HASH}DOWNLOAD_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/download"SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/src"BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/build"CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/googletest/install"
)# 將 Google Test 庫(kù)的頭文件和庫(kù)文件鏈接到主項(xiàng)目中
set(GTEST_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/install/include")
set(GTEST_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/googletest/install/lib/libgtest.a")
set(GTEST_MAIN_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/googletest/install/lib/libgtest_main.a")target_include_directories(myproject PRIVATE ${GTEST_INCLUDE_DIR})
target_link_libraries(myproject PRIVATE ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
在這個(gè)例子中,我們首先通過(guò)設(shè)置 GTEST_URL 和 GTEST_HASH 變量來(lái)指定要下載的 Google Test 庫(kù)的版本和哈希值。然后,我們使用 ExternalProject_Add 命令來(lái)下載和解壓源代碼,并使用 CMake 構(gòu)建 Google Test 庫(kù)。這里通過(guò)設(shè)置 PREFIX、URL、URL_HASH、DOWNLOAD_DIR、SOURCE_DIR、BINARY_DIR 和 CMAKE_ARGS 等參數(shù)來(lái)指定 ExternalProject_Add 的行為。最后,我們將 Google Test 庫(kù)的頭文件和庫(kù)文件鏈接到主項(xiàng)目中,以便在主項(xiàng)目中使用 Google Test 庫(kù)。
4.使用FetchContent 命令
CMake 也可以通過(guò) include(FetchContent) 命令引入第三方庫(kù)。FetchContent 命令允許您從指定的 URL 或 Git 存儲(chǔ)庫(kù)中提取第三方庫(kù),并將其作為 CMake 項(xiàng)目的子目錄構(gòu)建。使用 FetchContent 命令時(shí),您無(wú)需手動(dòng)下載、解壓縮或設(shè)置外部庫(kù)的構(gòu)建過(guò)程,CMake 會(huì)自動(dòng)執(zhí)行這些任務(wù)。
下面是使用 FetchContent 命令引入第三方庫(kù)的示例:
include(FetchContent)FetchContent_Declare(my_libraryGIT_REPOSITORY https://example.com/my_library.gitGIT_TAG v1.0.0
)FetchContent_GetProperties(my_library)
if(NOT my_library_POPULATED)FetchContent_Populate(my_library)add_subdirectory(${my_library_SOURCE_DIR} ${my_library_BINARY_DIR})
endif()
在這個(gè)示例中,FetchContent_Declare 命令聲明了一個(gè)名為 my_library 的第三方庫(kù),并指定了其 Git 存儲(chǔ)庫(kù)的 URL 和 Git tag。然后,FetchContent_GetProperties 命令獲取指定的第三方庫(kù)的屬性,并檢查它是否已經(jīng)被 FetchContent_Populate 命令所提取。如果尚未提取,FetchContent_Populate 命令將提取指定的庫(kù),并將其作為 CMake 項(xiàng)目的子目錄進(jìn)行構(gòu)建。最后,add_subdirectory 命令將提取的第三方庫(kù)的源代碼目錄和二進(jìn)制目錄添加到 CMake 項(xiàng)目中。
使用 FetchContent 命令的優(yōu)點(diǎn)是它使得引入第三方庫(kù)更加方便,并且使得與外部庫(kù)的集成更加簡(jiǎn)單。同時(shí),使用 FetchContent 命令時(shí),您可以很容易地在您的 CMake 項(xiàng)目中指定外部庫(kù)的版本和源代碼位置。
5.總結(jié)
當(dāng)引入第三方庫(kù)時(shí),CMake 提供了多種不同的方式。每種方式都有自己的優(yōu)缺點(diǎn),具體取決于項(xiàng)目的需求和環(huán)境。下面是一些不同的引入第三方庫(kù)的方法及其優(yōu)缺點(diǎn):
1、find_package 命令
find_package 命令是一種在 CMake 項(xiàng)目中查找已經(jīng)安裝的第三方庫(kù)的方法。這種方法適用于大多數(shù)開(kāi)源庫(kù),因?yàn)樗鼈兺ǔR呀?jīng)被打包為二進(jìn)制發(fā)行版,可以通過(guò)包管理器或官方網(wǎng)站下載并安裝。優(yōu)點(diǎn):使用已經(jīng)安裝的二進(jìn)制發(fā)行版,構(gòu)建速度快,不需要從源代碼構(gòu)建。缺點(diǎn):無(wú)法使用最新版本的庫(kù),需要手動(dòng)安裝和更新庫(kù)。2、add_subdirectory 命令
add_subdirectory 命令是一種在 CMake 項(xiàng)目中添加外部庫(kù)源代碼的方法。這種方法適用于已經(jīng)包含在您的項(xiàng)目中的外部庫(kù),或者您需要從源代碼構(gòu)建外部庫(kù)的情況。優(yōu)點(diǎn):直接在您的項(xiàng)目中構(gòu)建外部庫(kù),方便修改外部庫(kù)源代碼。缺點(diǎn):需要手動(dòng)更新外部庫(kù),庫(kù)的更新可能會(huì)導(dǎo)致項(xiàng)目中的構(gòu)建問(wèn)題。3、ExternalProject_Add 命令
ExternalProject_Add 命令是一種將外部庫(kù)作為獨(dú)立項(xiàng)目下載和構(gòu)建的方法。這種方法適用于需要與外部庫(kù)進(jìn)行集成,但是不想將外部庫(kù)的源代碼包含在您的項(xiàng)目中。優(yōu)點(diǎn):不需要在您的項(xiàng)目中包含外部庫(kù)的源代碼,允許更好的代碼分離和依賴(lài)管理。缺點(diǎn):需要從頭開(kāi)始構(gòu)建外部庫(kù),構(gòu)建速度可能很慢。同時(shí),需要手動(dòng)更新外部庫(kù),庫(kù)的更新可能會(huì)導(dǎo)致項(xiàng)目中的構(gòu)建問(wèn)題。4、FetchContent 命令
FetchContent 命令是一種從外部 URL 或 Git 存儲(chǔ)庫(kù)中提取源代碼的方法。這種方法適用于不需要將外部庫(kù)作為獨(dú)立項(xiàng)目構(gòu)建的情況,但是需要從源代碼構(gòu)建外部庫(kù)。優(yōu)點(diǎn):與 ExternalProject_Add 相比,構(gòu)建速度更快,而且不需要獨(dú)立的構(gòu)建目錄。缺點(diǎn):需要手動(dòng)更新外部庫(kù),庫(kù)的更新可能會(huì)導(dǎo)致項(xiàng)目中的構(gòu)建問(wèn)題。
總之,選擇適當(dāng)?shù)姆椒ㄈQ于項(xiàng)目的需求和環(huán)境。對(duì)于大多數(shù)情況,find_package 命令是首選方法,因?yàn)樗亲詈?jiǎn)單和最常用的方式。對(duì)于需要修改外部庫(kù)源代碼的情況,使用 add_subdirectory 命令可以更方便地管理代碼。對(duì)于需要將外部庫(kù)作為獨(dú)立項(xiàng)目構(gòu)建的情況,使用 ExternalProject_Add 命令是一種好的選擇。這種方法的優(yōu)點(diǎn)在于,它能夠?qū)⑼獠繋?kù)的構(gòu)建過(guò)程與您的項(xiàng)目分離,使代碼更易于管理和維護(hù)。不過(guò),這種方法的缺點(diǎn)是需要手動(dòng)更新外部庫(kù),更新可能會(huì)導(dǎo)致您的項(xiàng)目中出現(xiàn)構(gòu)建問(wèn)題。
如果您不需要將外部庫(kù)作為獨(dú)立項(xiàng)目構(gòu)建,但是需要從源代碼構(gòu)建外部庫(kù),那么 FetchContent 命令是一種不錯(cuò)的選擇。這種方法與 ExternalProject_Add 相比,構(gòu)建速度更快,而且不需要獨(dú)立的構(gòu)建目錄。但是,需要注意的是,需要手動(dòng)更新外部庫(kù),更新可能會(huì)導(dǎo)致您的項(xiàng)目中出現(xiàn)構(gòu)建問(wèn)題。
綜上所述,對(duì)于大多數(shù)情況,使用 find_package 命令是最簡(jiǎn)單和最常用的方式,因?yàn)樗軌蜃詣?dòng)查找已經(jīng)安裝的外部庫(kù)。對(duì)于需要修改外部庫(kù)源代碼的情況,使用 add_subdirectory 命令可以更方便地管理代碼。對(duì)于需要將外部庫(kù)作為獨(dú)立項(xiàng)目構(gòu)建的情況,使用 ExternalProject_Add 命令是一種好的選擇。對(duì)于不需要將外部庫(kù)作為獨(dú)立項(xiàng)目構(gòu)建,但是需要從源代碼構(gòu)建外部庫(kù)的情況,使用 FetchContent 命令是一種不錯(cuò)的選擇。