Как установить внешний проект CMake в CMAKE_CURRENT_BINARY_DIR - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь связать SDL2 с моим исполняемым файлом с помощью CMake.

Вот так выглядит каталог моего проекта.По сути, я скачал исходный код 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, он не может связать файлы DLL на моем компьютере с Windows.

Я думаю, было бы проще, если бы я мог установить SDL2 где-нибудь в ProjectRoot и использовать find_package чтобы найти цели, чтобы я мог связать свой исполняемый файл с его библиотеками.

  1. Можно ли установить внешний проект CMake во время настройки?
  2. Как мне это сделать?найти внешние цели проекта?

1 Ответ

0 голосов
/ 05 июня 2018
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 target.


Использование библиотеки

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