cmake - 如何将外部 CMake 项目安装到 CMAKE_CURRENT_BINARY_DIR
问题描述
我正在尝试使用 CMake 将 SDL2 链接到我的可执行文件。
这是我的项目目录现在的样子。基本上,我从他们的网站下载了SDL2 源代码并将其粘贴在 projectRoot 下。
projectRoot/
SDL2/
include/
cmake/
...
CMakeLists.txt
SDL2Config.cmake
CMakeLists.txt
我尝试将 SDL2 添加为如下子目录(projectRoot/CMakeLists.txt):
cmake_minimum_required (VERSION 2.8)
project (myProject)
# SDL
add_subdirectory (SDL2 EXCLUDE_FROM_ALL)
target_include_directories (SDL2 PUBLIC $<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>)
set (
SOURCE_FILES
src/game.cpp
src/main.cpp
src/sdlwrapper.cpp
)
add_executable (my_executable ${SOURCE_FILES})
target_include_directories (my_executable PRIVATE src)
target_link_libraries (my_executable SDL2)
虽然这适用于我的 linux 环境,但它无法链接我的 Windows 机器上的 dll 文件。
我认为如果我可以在 projectRoot 下的某个位置安装 SDL2 并使用find_package
它来查找它的目标会更容易,这样我就可以将我的可执行文件链接到它的库。
- 是否可以在配置期间安装外部 CMake 项目?
- 我应该如何找到外部项目的目标?
解决方案
ExternalProject_Add(external_sdl
PREFIX "${CMAKE_BINARY_DIR}/external"
URL "https://www.libsdl.org/release/SDL2-2.0.8.tar.gz"
URL_HASH SHA256=edc77c57308661d576e843344d8638e025a7818bff73f8fbfab09c3c5fd092ec
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external/installed
)
set_target_properties(external_sdl PROPERTIES EXCLUDE_FROM_ALL TRUE)
构建external_sdl
目标。
使用图书馆
include(GNUInstallDirs)
link_directories(${CMAKE_BINARY_DIR}/external/installed/${CMAKE_INSTALL_LIBDIR})
target_include_directories(my_executable
PRIVATE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/external/installed/${CMAKE_INSTALL_INCLUDEDIR}>
)
还
find_package(... HINTS ${CMAKE_BINARY_DIR}/external/installed/${CMAKE_INSTALL_LIBDIR})
见文档
奖励:如果您有多个外部项目,而不是一个一个地构建它们,您可以创建(父)external_all
空目标并使其依赖于所有外部项目。
add_custom_target(external_all)
set_target_properties(external_all PROPERTIES EXCLUDE_FROM_ALL TRUE)
ExternalProject_Add(external_sdl ...)
add_dependencies(external_all external_sdl)
ExternalProject_Add(external_whatever ...)
add_dependencies(external_all external_whatever)
推荐阅读
- selenium - 我不能运行超过 117 个网址
- asp.net - 我想从 json 列表中返回 id。但它给出了一个错误
- android - Android (Java) 上的 Firebase Firestore:这里有多少和什么样的请求?
- python - 迭代时将函数值附加到列表
- python - SharePlum 下载文件 - 文件是字符串?
- python - Python 正则表达式:带有 re.ASCII 的模式仍然可以匹配 unicode 字符?
- javascript - 反应中的动态提取功能
- elasticsearch - 弹性搜索中的嵌套查询
- python - 对于每个组,如果最近一年具有特定值,我如何替换前几年的值?
- svelte - 如何在路线之外的 Sapper 项目中使用 fetch?