c++++中主流的第三方依賴管理工具包括vcpkg、conan和cmake fetchcontent。①vcpkg簡單易用,適合快速上手,安裝后通過命令安裝依賴并在cmake中配置toolchain文件即可使用;②conan功能強大且配置靈活,支持跨平臺,通過conanfile定義依賴并生成cmake配置;③cmake fetchcontent集成度高,無需額外工具,直接在cmakelists.txt中聲明依賴源碼倉庫即可引入第三方庫。選擇時應根據(jù)項目復雜度、配置需求及是否希望避免額外工具進行權衡。
c++中的第三方依賴管理,說白了就是解決“我的代碼要用到別人的代碼,怎么才能方便地把別人的代碼弄過來,并且保證版本正確,不和其他依賴沖突”的問題。包管理工具就是干這個的。
vcpkg、Conan、CMake FetchContent,這三個算是比較主流的選擇。vcpkg 用起來簡單,Conan 功能強大,CMake FetchContent 集成度高。
解決方案
vcpkg:簡單易用,上手快
立即學習“C++免費學習筆記(深入)”;
vcpkg 是 microsoft 開發(fā)的 C++ 包管理器,它的優(yōu)點是簡單易用,上手快。
-
安裝 vcpkg:
先從 gitHub 上 clone vcpkg 倉庫:
git clone https://github.com/microsoft/vcpkg.git
然后運行 bootstrap 腳本:
-
安裝依賴:
比如,要安裝 Boost 庫,只需要執(zhí)行:
./vcpkg install boost
vcpkg 會自動下載、編譯 Boost 庫,并把它安裝到 vcpkg 的安裝目錄下。
-
在 CMake 中使用 vcpkg:
在 CMakeLists.txt 文件中,添加以下內容:
set(CMAKE_TOOLCHaiN_FILE "[vcpkg_root]/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
把 [vcpkg_root] 替換成 vcpkg 的安裝目錄。
然后,就可以在 CMakeLists.txt 中使用 find_package 命令來查找 vcpkg 安裝的庫了:
find_package(Boost REQUIRED COMPONENTS system filesystem) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(my_project Boost::boost) endif()
這樣,CMake 就會自動找到 Boost 庫,并把它鏈接到你的項目中。
Conan:功能強大,配置靈活
Conan 是一個跨平臺的 C++ 包管理器,它的優(yōu)點是功能強大,配置靈活。
-
安裝 Conan:
pip install conan
Conan 是用 python 寫的,所以需要先安裝 Python 和 pip。
-
創(chuàng)建 conanfile.txt 或 conanfile.py:
在你的項目根目錄下,創(chuàng)建一個 conanfile.txt 或 conanfile.py 文件,用來描述你的項目依賴。
conanfile.txt 的例子:
[requires] boost/1.76.0 [generators] cmake
conanfile.py 的例子:
from conan import ConanFile from conan.tools.cmake import CMakeToolchain, CMake class MyProjectConan(ConanFile): settings = "os", "compiler", "build_type", "arch" requires = "boost/1.76.0" generators = "CMakeToolchain", "CMakeDeps" def layout(self): self.folders.source = "src" def build(self): cmake = CMake(self) cmake.configure() cmake.build()
-
安裝依賴:
conan install . --build missing
Conan 會根據(jù) conanfile.txt 或 conanfile.py 文件,下載、編譯依賴,并生成 CMake 需要的配置文件。
-
在 CMake 中使用 Conan:
在 CMakeLists.txt 文件中,添加以下內容:
include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)
然后,就可以像使用普通的 CMake 項目一樣,使用 find_package 命令來查找 Conan 安裝的庫了。
CMake FetchContent:集成度高,無需額外工具
CMake FetchContent 是 CMake 內置的模塊,它可以直接從 Git 倉庫或其他 URL 下載依賴,并把它添加到你的項目中。它的優(yōu)點是集成度高,無需額外工具。
-
在 CMakeLists.txt 中使用 FetchContent:
include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.11.0 ) FetchContent_MakeAvailable(googletest) include_directories(${googletest_SOURCE_DIR}/googletest/include) target_link_libraries(my_project gtest)
這段代碼會從 GitHub 上下載 googletest 庫,并把它添加到你的項目中。
如何選擇合適的包管理工具?
這取決于你的項目需求和個人偏好。
- 如果你的項目比較簡單,或者你只是想快速上手,那么 vcpkg 是一個不錯的選擇。 它的優(yōu)點是簡單易用,上手快,而且 Microsoft 官方支持,社區(qū)活躍。
- 如果你的項目比較復雜,需要更靈活的配置,那么 Conan 是一個更好的選擇。 它的優(yōu)點是功能強大,配置靈活,支持多種構建系統(tǒng)和平臺。
- 如果你的項目已經(jīng)使用了 CMake,并且不想引入額外的工具,那么 CMake FetchContent 是一個不錯的選擇。 它的優(yōu)點是集成度高,無需額外工具,但是功能相對簡單,不如 vcpkg 和 Conan 強大。
包管理工具如何解決依賴沖突問題?
包管理工具通常會使用一些技術來解決依賴沖突問題,比如:
- 版本控制: 包管理工具會記錄每個依賴的版本號,確保每個項目使用的都是正確的版本。
- 依賴圖: 包管理工具會構建一個依賴圖,記錄每個依賴之間的關系,從而避免循環(huán)依賴和版本沖突。
- 沖突解決: 當出現(xiàn)依賴沖突時,包管理工具會提供一些工具來幫助你解決沖突,比如選擇不同的版本,或者排除某些依賴。
除了 vcpkg、Conan 和 CMake FetchContent,還有其他的 C++ 包管理工具嗎?
還有一些其他的 C++ 包管理工具,比如:
- Hunter: Hunter 是一個基于 CMake 的包管理器,它的優(yōu)點是易于使用,而且可以自動生成 CMake 配置文件。
- CPM: CPM 是一個 CMake 模塊,它可以從 GitHub 上下載依賴,并把它添加到你的項目中。
- Buckaroo: Buckaroo 是一個 C++ 包管理器,它的優(yōu)點是速度快,而且支持多種構建系統(tǒng)和平臺。
但是,這些包管理工具的流行程度不如 vcpkg、Conan 和 CMake FetchContent,所以使用的人也比較少。
選擇哪種包管理工具,最終還是取決于你的項目需求和個人偏好。 關鍵在于選擇一個能夠簡化依賴管理流程,并提高開發(fā)效率的工具。