【问题标题】:CMake, prebuild SDL2 (and other dependencies) if neededCMake,如果需要,预构建 SDL2(和其他依赖项)
【发布时间】:2014-12-27 18:57:12
【问题描述】:

实际上,当使用 GCC 作为编译器调用 CMake 时,SDL2 可以开箱即用地编译,我很高兴。软件应该总是那么容易构建,但我想要更多。

假设我的所有软件都在这样的目录树中:

F:/GIT/SDL2_0_3
F:/GIT/myProject

我想要实现的是调用 CMake

F:/GIT/myProject/build/XXX> cmake ../../ -G "GeneratorName"

获得

F:/GIT/myProject/bin/XXX/libMyProject.dll
F:/GIT/myProject/bin/XXX/libSDL2.dll
F:/GIT/myProject/build/XXX/projectfile 

XXX是目标的名字(我加的一个变量):

-DTARGET_NAME:STRING="XXX"

是否可以“add_subdirectory(SDL)”以便我可以将所有内容委托给

F:/GIT/SDL2_0_3/CMakeLists.txt

实际上我必须单独构建 SDL,但是进入 X 个文件夹以拥有 X 个不同的 SDL 二进制文件有点乏味(并且为每个依赖重复 X,因为我不限于 SDL,实际上一个批处理脚本正在这样做我,但我想迁移到 Cmake,因为它是便携式的)。

我有一个文件夹,其中包含我使用的所有库和项目 (F:/GIT),因此我无法在以下位置使用 CMakeLists.txt 文件:

F:/GIT/CMakeLists.txt

所以这个问题不是重复的:Depending on another CMake project(我需要一个不同的答案,因为另一个还不够)

PS:

我特别需要多个目标,因为我正在交叉编译并支持某些编译器的多个版本(因为不同编译器版本的二进制文件只会崩溃...... GCC u.u)

【问题讨论】:

    标签: cmake


    【解决方案1】:

    好吧终于找到答案了:

    add_subdirectory( ../SDL2_0_3 ${CMAKE_BINARY_DIR}/SDL2)
    

    首先我必须使用相对路径,所以我使用../ 返回一级目录,然后指定我感兴趣的文件夹SDL2_0_3。然后由于源目录在我的项目之外,我必须指定一个新的二进制目录(add_subdirectory 的第二个参数)。

    我不能使用:

    ${CMAKE_BINARY_DIR}
    

    因为我会得到类似命名的 Cmake 元文件(因此每个都覆盖另一个),所以我必须更深入一点

    ${CMAKE_BINARY_DIR}/SDL2
    

    但现在的问题是共享库很少,所以我必须在需要的地方复制 DLL。

    在构建目录中:

    add_custom_command(TARGET SDL2 POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:SDL2> 
        "../../build/${TARGET_NAME}/$<TARGET_FILE_NAME:SDL2>"
    )
    

    在测试目录中:

    add_custom_command(TARGET SDL2 POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:SDL2> 
        "../../build/${TARGET_NAME}/tests/$<TARGET_FILE_NAME:SDL2>"
    )
    

    在二进制发布目录中:

    add_custom_command(TARGET SDL2 POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:SDL2> 
        "../../bin/${TARGET_NAME}/$<TARGET_FILE_NAME:SDL2>"
    )
    

    唯一不好的一点是,从 CMake-Gui 构建 SDL 需要大约 10 秒,而从脚本构建它需要大约 5 分钟(我猜是因为他们从 GUI 进行统一构建)。我不想弄乱 SDL 脚本,所以我希望他们能尽快解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多