【发布时间】:2021-09-30 04:24: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 构建,您可以通过
add_subdirectory(${libname_SOURCE_DIR})调用将 lib 添加到您的构建中。我快速浏览了 SDL。看起来它不是用 cmake 构建的。在这种情况下,您可以尝试使用 cmake.org/cmake/help/latest/command/add_custom_target.html 构建 SDL(使用 COMMAND 关键字调用 SDL 的本机构建 cmd),然后配置自定义目标,以便其他目标可以依赖它。一篇很棒的文章如何做到这一点:pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right -
@Matt 所以基本上如果库是基于 CMake 的库,我可以
add_subdirectory让 CMake 为我完成这项工作。否则我必须用add_custom_target“手工”构建它。很高兴知道,您可以将您的评论变成答案:) -
我已经发布了答案。在再次查看 SDL 之后,它似乎实际上 确实 使用 cmake 构建......也许我登陆了一个过时的版本,或者最初查看了错误的 repo。因此,这有望使其更容易集成到您的构建中。
标签: cmake