0

当我调用 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)
4

1 回答 1

2

这是因为 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语法上不正确,它缺少要找到的文件的名称。

于 2018-11-28T17:42:00.760 回答