如何将外部CMake项目安装到CMAKE_CURRENT_BINARY_DIR

时间:2018-06-03 19:26:17

标签: cmake sdl-2

我正在尝试使用CMake将SDL2链接到我的可执行文件。

以下是我的项目目录现在的样子。基本上,我从他们的网站下载了SDL2 source code并将其粘贴在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来查找其目标会更容易,这样我就可以将我的可执行文件链接到它的库。

  1. 是否可以在配置时安装外部CMake项目?
  2. 我应该如何找到外部项目的目标?

1 个答案:

答案 0 :(得分:2)

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})

请参阅docs

奖励:如果您有多个外部项目,而不是逐个构建它们,您可以创建(父)external_all空目标并使其依赖所有外部项目。 / p>

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)