CMake FetchContent使用
有些我们需要依赖的库,使用vcpkg搜索不到,这时可以使用CMake提供的FetchContent方法去让CMake自动下载依赖库。
接着文章vcpkg示例 - 小木槌的代码Fu-XDU/vcpkg-example at 332a29继续向后添加FetchContent的内容。
添加CMake子模块
在项目根目录下创建文件夹cmake
,我们要在里面放置CMake子模块。
在cmake
下创建文件ProjectCoost.cmake
:
cmake
include(FetchContent)
FetchContent_Declare(
coost
GIT_REPOSITORY "https://${URL_BASE}/idealvin/coost.git"
GIT_TAG "v3.0.0"
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/src/coost
OVERRIDE_FIND_PACKAGE
)
FetchContent_MakeAvailable(coost)
这就是FetchContent下载一个包的声明过程:
- 把cmake提供的FetchContent包include进来。
- 声明我们要获取的内容,包括其名称、git地址和tag、源码下载位置。
- 使用FetchContent_MakeAvailable去开始下载过程。
随后在项目的CMakeLists.txt
中写入:
cmake
include(ProjectCoost)
# 链接时链接下载的coost::co库
target_link_libraries(vcpkg_learn PRIVATE cryptopp::cryptopp coost::co)
随后即可在自己的项目源码中使用第三方库coost了。
这个项目会在cmake ..
构建时去获取内容。
到目前为止,项目可在GitHub中下载:Fu-XDU/vcpkg-example at 8419a2
FetchContent集成vcpkg
注意,相比于将vcpkg作为git子模块,FetchContent集成vcpkg并不惯用。原因:
- https://github.com/microsoft/vcpkg/pull/27311#issuecomment-1290635936
- https://stackoverflow.com/questions/73967245/why-is-vcpkg-recommended-as-a-git-submodule/73970871#73970871
文章vcpkg示例 - 小木槌手动在项目中部署了vcpkg,但是FetchContent可以直接下载vcpkg并部署,这里我们将代码Fu-XDU/vcpkg-example at 8419a2进行改造,使FetchContent直接下载vcpkg并部署。
在cmake/
目录下新增文件ProjectVcpkg.cmake
:
bash
include(FetchContent)
set(PACKAGE_NAME vcpkg)
FetchContent_Declare(
${PACKAGE_NAME}
GIT_REPOSITORY "https://${URL_BASE}/microsoft/vcpkg.git"
GIT_TAG "2023.08.09"
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/src/${PACKAGE_NAME}
)
FetchContent_MakeAvailable(${PACKAGE_NAME})
修改CMakeLists.txt
,使其内容如下:
cmake
cmake_minimum_required(VERSION 3.26)
set(CMAKE_CXX_STANDARD 14)
if (NOT DEFINED URL_BASE)
set(URL_BASE "github.com")
endif ()
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
set(VERSION "3.4.0")
set(VERSION_SUFFIX "")
# vcpkg init
include(ProjectVcpkg)
set(CMAKE_TOOLCHAIN_FILE "${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
project(vcpkg_learn)
include_directories(${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include)
link_directories(${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib)
find_package(cryptopp CONFIG REQUIRED)
include(ProjectCoost)
# hide linker warnings on OS X
# issue: https://github.com/Microsoft/vcpkg/issues/4497
IF (CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(other_flags "${other_flags} -frtti -fvisibility-inlines-hidden")
set(other_flags "${other_flags} -fvisibility=hidden")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${other_flags}")
ENDIF ()
add_executable(vcpkg_learn main.cpp)
target_link_libraries(vcpkg_learn PRIVATE cryptopp::cryptopp coost::co)
后面再使用cmake ..
去构建项目时,vcpkg会被自动配置并自动下载vcpkg.json中的依赖。
到目前为止,项目可在GitHub中下载:Fu-XDU/vcpkg-example at 987dff