【问题标题】:Trouble linking sdl_mixer with cmake无法将 sdl_mixer 与 cmake 链接
【发布时间】:2018-11-29 23:42:29
【问题描述】:

当我调用 Mix_OpenAudio(...) 时,我特别得到了一个未定义的引用。我可以包含“SDL_mixer.h”就好了。 这是我的 CMakeList.txt。对包含的所有其他软件包感到抱歉。我还将包括 FindSDL_MIXER.cmake。 我也可以创建 SDL_Mixer 数据类型。我使用 apt-get install 安装了 SDL_Mixer。

PROJECT(Window)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)


SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/CMakeModules")
add_definitions( -DMAGICKCORE_QUANTUM_DEPTH=16 )
add_definitions( -DMAGICKCORE_HDRI_ENABLE=0 )

FIND_PACKAGE(OpenGL REQUIRED)
FIND_PACKAGE(SDL2 REQUIRED)
FIND_PACKAGE(GLEW REQUIRED)
FIND_PACKAGE(GLM REQUIRED)
FIND_PACKAGE(Bullet REQUIRED)
FIND_PACKAGE(ASSIMP REQUIRED)
FIND_PACKAGE(ImageMagick COMPONENTS Magick++ REQUIRED )
FIND_PACKAGE(SDL_MIXER)
SET(CXX11_FLAGS "-std=gnu++11 -lassimp")
SET(CDEBUG_FLAGS -g)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX11_FLAGS} ${CDEBUG_FLAGS}")
SET(TARGET_LIBRARIES "${OPENGL_LIBRARY} ${SDL2_LIBRARY} ${ASSIMP_LIBRARIES}")

# Find where Magick++-config lives

IF(UNIX)
  ADD_DEFINITIONS(-DUNIX)
ENDIF(UNIX)

IF(NOT APPLE)
  IF(GLEW_FOUND)
      INCLUDE_DIRECTORIES(${GLEW_INCLUDE_DIRS})
      LINK_LIBRARIES(${GLEW_LIBRARIES})
  ENDIF(GLEW_FOUND)
  IF(ASSIMP_FOUND)
      INCLUDE_DIRECTORIES(${ASSIMP_INCLUDE_DIRS})
      LINK_LIBRARIES(${ASSIMP_LIBRARIES})
  ENDIF(ASSIMP_FOUND)
ENDIF(NOT APPLE)


INCLUDE_DIRECTORIES(
  "${PROJECT_SOURCE_DIR}/include"
  ${SDL2_INCLUDE_DIR}
  ${GLM_INCLUDE_DIRS}
  ${ASSIMP_INCLUDE_DIRS}
  ${ImageMagick_INCLUDE_DIRS}
  ${BULLET_INCLUDE_DIRS}
)

# Copy shaders, models, and default config
# FILE(COPY src/shaders DESTINATION .)
# FILE(COPY models DESTINATION .)
# FILE(COPY textures DESTINATION .)
# FILE(COPY config.json DESTINATION .)


# Set Includes
SET(INCLUDES ${PROJECT_SOURCE_DIR}/include)
INCLUDE_DIRECTORIES(${INCLUDES} ${ASSIMP_INCLUDE_DIRS} ${ImageMagick_INCLUDE_DIRS} ${BULLET_INCLUDE_DIRS})

# Set sources
FILE(GLOB_RECURSE SOURCES "src/*.cpp")
ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES})

add_custom_target("${PROJECT_NAME}_SUCCESSFUL" ALL
                  DEPENDS ${PROJECT_NAME}
                  COMMAND ${CMAKE_COMMAND} -E echo ""
                  COMMAND ${CMAKE_COMMAND} -E echo "====================="
                  COMMAND ${CMAKE_COMMAND} -E echo "  Compile complete!"
                  COMMAND ${CMAKE_COMMAND} -E echo "====================="
                  COMMAND ${CMAKE_COMMAND} -E echo "${CMAKE_CURRENT_BINARY_DIR}"
                 )

TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OPENGL_LIBRARY} ${SDL2_LIBRARY} ${ASSIMP_LIBRARY} ${ImageMagick_LIBRARIES} ${BULLET_LIBRARIES} ${SDL_MIXER_LIBRARY})

现在是 FindSDL_MIXER.cmake。

#
# Find SDL_MIXER
#

# Additional modules
include(FindPackageHandleStandardArgs)

# Find include files
find_path(
  SDL_MIXER_INCLUDE_DIR
  PATHS
  /usr/include
  /usr/local/include
  /sw/include
  /opt/local/include
  ${SDL_MIXER_ROOT_DIR}/include
  DOC "The directory where SDL_mixer.h resides")

# Handle REQUIRD argument, define *_FOUND variable
#find_package_handle_standard_args(SDL_MIXER_INCLUDE_DIR)

# Hide some variables
mark_as_advanced(SDL_MIXER_INCLUDE_DIR)

【问题讨论】:

    标签: cmake sdl sdl-mixer


    【解决方案1】:

    这是因为 FindSDL_MIXER.cmake 没有设置库变量。 cmake 3.13 有一个更新的 FindSDL_mixer.cmake 可以正确设置它,您可以将其用作示例。具体来说,您需要在 FindSDL_MIXER.cmake 中使用这样的一行来查找库并设置变量。

    find_library(SDL_MIXER_LIBRARY
      NAMES SDL2_mixer
      HINTS
        ENV SDLMIXERDIR
        ENV SDLDIR
      PATH_SUFFIXES lib
    )
    

    我还注意到 SDL_MIXER_INCLUDE_DIR 似乎没有在目标的 CMakeLists.txt 中使用。只是碰巧它可能与包含的其他一些头文件位于同一位置。

    您可能还想将文件重命名为 FindSDL2_MIXER.cmake 并更改相应的FIND_PACKAGE(SDL2_MIXER)。我不完全确定是否正在使用发布的 FindSDL_MIXER.cmake,因为看起来 find_path 在语法上不正确,它缺少要找到的文件的名称。

    【讨论】:

    • 现在是SDL2_mixer,我认为cmake 没有捆绑SDL2 的任何东西。我怀疑是否可以将旧的SDL_mixerSDL2 一起使用。
    • 我已经更新了答案以阐明修复 FindSDL_MIXER.cmake 需要做什么。我并不是要建议使用错误的库,而是要如何解决问题。
    • 完全没有问题,在我发表评论时我赞成你的回答,只是想澄清使用不兼容的库不太可能成功。
    • @keltar 谢谢,这让我觉得他们可能是 cmake 附带的内容和 OP 想要的内容之间的名称冲突。我已经更新了答案来解决这个问题。
    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多