【问题标题】:How to install external CMake project to CMAKE_CURRENT_BINARY_DIR如何将外部 CMake 项目安装到 CMAKE_CURRENT_BINARY_DIR
【发布时间】:2018-06-03 19:26:17
【问题描述】:

我正在尝试使用 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. 我应该如何找到外部项目的目标?

【问题讨论】:

    标签: cmake sdl-2


    【解决方案1】:
    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 空目标并使其依赖于所有外部项目。

    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)
    

    【讨论】:

    • 但是我怎样才能从那些 ExternalProject 链接库呢?我不能只用这个设置做 target_link_libraries(myexecutable SDL2)。
    • 一切都在${CMAKE_BINARY_DIR}/external/installed 目录中。您必须指示 CMake 在那里查找头文件和库。我用更多信息更新了答案。
    • 谢谢。我会尝试一下,然后返回给你结果。
    • 好的,这就是我所做的:编写下载和安装 ExternalProjects 的 CMakeLists.txt.in 文件,并使用 configure_file 将该文件复制到构建目录中;使用 execute_process 在该文件上运行 cmake。之后,我可以像您在回答中那样做find_packagetarget_link_libraries。这不完全是您所做的,但到目前为止效果很好。谢谢
    • 这是新东西,谢谢分享。通常我会构建我的项目两次:构建外部项目,重新加载 cmake,构建 my_executable。
    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2021-08-06
    • 2016-03-04
    • 2023-04-07
    相关资源
    最近更新 更多