【问题标题】:Using SDL2 with SDL2_image on OSX 10.11 (CMake 3.3 within CLion 1.1)在 OSX 10.11 上使用 SDL2 和 SDL2_image(CLion 1.1 中的 CMake 3.3)
【发布时间】:2015-10-14 21:24:58
【问题描述】:

我正在学习 reddit.com/r/limeoats 的一些教程,以学习一些 C++ 游戏开发。我没有使用 CMake 或 CLion 的经验,并且到目前为止已经设法通过谷歌搜索。

在我将 OSX 更新为 El Capitan (10.11) 之前,我的一切正常。看来我不能再使用#include "SDL2/SDL.h" 而是需要使用#include "SDL.h" 然后它可以找到SDL 标头。当我也使用#include "SDL_image.h" 时出现问题,我收到以下编译器错误:

/Library/Frameworks/SDL2_image.framework/Headers/SDL_image.h:27:10:
fatal error: 'SDL2/SDL.h' file not found
#include <SDL2/SDL.h>
         ^

查看我的 Frameworks 文件夹中的头文件,它有 #include &lt;SDL2/SDL.h&gt; 但 CMake 在将 OSX 升级到 10.11 后出于某种原因将其提供为 SDL.h。

如何让 SDL 扩展与更新后的标头路径配合使用?或者如何让 CMake 将旧的 SDL2/SDL.h 标头路径返回给我?

下面是我的 CMakeLists.txt,我得到了 FindSDL2.cmake(注意第 50 行的注释)和来自 here 的 FindSDL2_image.cmake。

cmake_minimum_required(VERSION 3.3)
project(Cavestory)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)

include_directories(${PROJECT_SOURCE_DIR}/source/headers)

find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED >=2.0.0)

include_directories(${SDL2_INCLUDE_DIR})
include_directories(${SDL2_IMAGE_INCLUDE_DIR})

file(GLOB SOURCE_FILES "source/src/*.cpp")

add_executable(Cavestory ${SOURCE_FILES})

# One thread said this is all I should need to link SDL2
# but cannot get this to work at all
#target_link_libraries(Cavestory SDL2 SDL2_image)

#add_custom_command(TARGET Cavestory POST_BUILD
#        COMMAND ${CMAKE_COMMAND} -E copy_directory
#        ${CMAKE_SOURCE_DIR}/content $<TARGET_FILE_DIR:Cavestory>)

还有我的目录结构(如果有帮助的话)...

/Cavestory (root)
    CMakeLists.txt
    /bin
    /cmake
        FindSDL2.cmake
        FindSDL2_image.cmake
    /content
        /sprites
            **images**
    /docs
    /source
        /headers
           **header files**
        /src
           **code files**

【问题讨论】:

  • 尝试删除 include_directories(${SDL2_INCLUDE_DIR}) include_directories(${SDL2_IMAGE_INCLUDE_DIR}) 因为它是多余的。 find_package 会为你做的。
  • 顺便说一句,您应该包括SDL.h,而不是SDL/SDL.hSource.
  • @MinaKamel - 删除了这些行,编译器找不到 sdl.h 或 SDL2/sdl.h - 根据我读过的内容,FindSDL.cmake 设置了这些变量,但不使用它们调用 include_directories。
  • @zenith - 这就是我正在做的事情,它适用于 我的代码 但不适用于 SDL_image.h (这不是我的,包括 正如我在上面所说的那样。
  • 当前的SDL2_image 似乎与最新的SDL2 不兼容。将SDL2DIR environment 变量(注意$ENV{SDL2DIR}findSDL2.cmake 中)设置为旧的SDL2 安装并进行新的配置。

标签: c++ macos cmake sdl-2 clion


【解决方案1】:

我觉得自己很愚蠢...我的 CMakeLists.txt 文件是正确的,但我需要添加以下内容

target_link_libraries(Cavestory ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY})

而不是

target_link_libraries(Cavestory SDL2 SDL2_image)

这修复了 SDL_image.h 中的 SDL 链接问题;但是,在更新到 El Capitan 后,我无法再通过 #include "SDL2/SDL.h" 引用 SDL,必须使用 #include "SDL.h" - 虽然这是首选,但我想知道为什么/如何在 OSX 10.10 和 OSX 10.11 之间发生这种变化。

【讨论】:

  • 更改 target_link_libraries 不会影响包含目录(链接在编译源之后出现)。可能,问题出在其他地方。无论如何,你已经解决了它是件好事。
  • @Rob 您在这个线程之外还尝试过其他什么吗?升级到 El Capitan 后,我看到了同样的行为,并没有成功。
  • 我没有。我通过 #include "SDL.h" 而不是 #include "SDL/SDL.h" 在我的代码中包含 SDL,不知道为什么它在 OSX 版本之间发生了变化,这对我来说很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 2014-07-14
相关资源
最近更新 更多