如何构建使用 CMake FetchContent 下载的外部库?

2023-11-27

我有一个依赖于外部库(例如 SDL)的程序。我希望 CMake 为我处理这种依赖性,所以我正在研究FetchContent。据我了解,该模块只是下载源代码,以便可以在以下位置获得有关外部库的信息配置时间。例如:

include(FetchContent)

FetchContent_Declare(sdl
  GIT_REPOSITORY <...>
)

FetchContent_GetProperties(sdl)

# sdl_POPULATED, sdl_SOURCE_DIR and sdl_BINARY_DIR are ready now

if(NOT sdl_POPULATED)
  FetchContent_Populate(sdl)
endif()

然而,在某些时候,我想构建该源代码并将其链接到我的主要可执行文件。如何以“现代 CMake 方式”做到这一点?


作为构建的一部分从源代码构建外部库的推荐方法取决于外部库提供的构建方式。

使用 cmake 构建外部库

如果外部库使用 cmake 构建,那么您可以通过 add_subdirectory(${libname_SOURCE_DIR}) 调用将该库添加到您的构建中。这样 cmake 会将外部库构建为子文件夹(“子项目”)。这CMakeLists.txt外部库的文件会有一些add_library(ext_lib_name ...)其中的陈述。为了那时use您的目标中的外部库(依赖于外部库的应用程序或库)您可以简单地调用target_link_libraries(your_application <PRIVATE|PUBLIC|INTERFACE> ext_lib_name) https://cmake.org/cmake/help/latest/command/target_link_libraries.html

我快速浏览了一下这个 github 存储库https://github.com/rantoniello/sdl-(如果您指的是另一个库,请告诉我),它实际上看起来像是使用 cmake 构建的,并且它允许客户端静态或动态链接它:https://github.com/rantoniello/sdl/blob/master/CMakeLists.txt#L1688-L1740

所以,理想情况下你的应用程序应该能够做到

add_executable(myapp ...)
target_link_libraries(myapp PRIVATE SDL2-static) // Statically link againt SDL2

由于他们的 CMakeLists.txt 文件SDL2-static附带的属性(包括目录、链接器标志/命令)将自动分配给myapp.

外部库不使用 cmake 构建

如果外部库不能使用 cmake 构建,那么可以尝试使用add_custom_target https://cmake.org/cmake/help/latest/command/add_custom_target.html建立图书馆。大致如下:

add_custom_target(myExternalTarget COMMAND <invoke the repo's build system>)

然后,您需要通过正确的 cmake 函数自行设置对客户端很重要的目标属性set_target_properties, target_include_directories...关于如何开始处理这些事情的一篇很棒的文章:https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建使用 CMake FetchContent 下载的外部库? 的相关文章

随机推荐