Skip to content

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下载一个包的声明过程:

  1. 把cmake提供的FetchContent包include进来。
  2. 声明我们要获取的内容,包括其名称、git地址和tag、源码下载位置。
  3. 使用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并不惯用。原因:

文章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