【问题标题】:I'm trying to SDL_DisplayFormat a .png file, I think, I may be missing a dependency我正在尝试 SDL_DisplayFormat 一个 .png 文件,我想,我可能缺少依赖项
【发布时间】:2019-10-22 06:06:28
【问题描述】:

这是给我一个分段故障转储的功能, 就是这条线:

optimizedImage = SDL_DisplayFormat( loadedImage );

尝试使用我的 IDE 的代码块在 ubuntu Linux 上构建它。

我非常接近并希望使用 SDL 混音器功能,并且如果完全设置好 png 也会很高兴。

刚刚发现该功能可能已被弃用。 SDL_ConvertSurfaceFormat();似乎是替代品并且是 sdl2 的一部分。但是当我尝试它时出现未定义的错误。sdl 和 sdl2 似乎正确链接。

SDL_Surface *load_image( std::string filename )
{
    //The image that's loaded
    cout<< "entered load image files"<< endl;
    SDL_Surface* loadedImage = NULL;

    //The optimized surface that will be used
    SDL_Surface* optimizedImage = NULL;

    //Load the image
    loadedImage = IMG_Load( filename.c_str() );
cout<< "image image should be set"<< endl;
    //If the image loaded
    if( loadedImage != NULL )
    {
    cout<< "loaded image isn't null, hooray!"<< endl;
        //Create an optimized surface
        optimizedImage = SDL_DisplayFormat( loadedImage );
cout<< "optimized image should be in display format now"<< endl;
        //Free the old surface
        SDL_FreeSurface( loadedImage );
cout<< "sdl surface is free"<< endl;
        //If the surface was optimized
        if( optimizedImage != NULL )
        {cout<< "optimized image is not null"<< endl;
            //Color key surface
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
            cout<< "sdl setcolor key is ok"<< endl;
        }
    }

    //Return the optimized surface
    return optimizedImage;
}

这是我的 cmakelists.text 文件


# CMake entry point
cmake_minimum_required (VERSION 3.0)


project (maficengine LANGUAGES C CXX ASM)




set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/external/")


find_package(PNG REQUIRED)
find_package(ZLIB)
find_package(OpenGL REQUIRED)
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)

add_definitions(${PNG_DEFINITIONS})


include_directories(${SDL2_INCLUDE_DIRS}
 ${SDL2_IMAGE_INCLUDE_DIRS})

include_directories(${PNG_INCLUDE_DIR})

find_path(PNG_INCLUDE_DIR png.h)

find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2)
find_library(SDL2_LIBRARY NAME SDL2)

set(SDL2_INCLUDE_DIR /usr/include/SDL2)
set(SDL2_LIBRARY /usr/lib/x86_64-linux-gnu/libSDL2.so)
file(GLOB_RECURSE SOURCE_FILES/usr/lib/x86_64-linux-gnu
    ${CMAKE_SOURCE_DIR}/src/*.c
    ${CMAKE_SOURCE_DIR}/src/*.cpp)

INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL REQUIRED sdl)

set(SDL_INCLUDE_DIR "/usr/include/SDL2")
set(SDL_LIBRARY "SDL2")
include(FindSDL)

if(SDL_FOUND)
  message(STATUS "SDL FOUND")
  elseif(!SDL_FOUND)
     message(STATUS "SDL not FOUND")
endif()



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

if( CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR )
    message( FATAL_ERROR "Please select another Build Directory ! (and give it a clever name, like bin_Visual2012_64bits/)" )
endif()
if( CMAKE_SOURCE_DIR MATCHES " " )
    message( "Your Source Directory contains spaces. If you experience problems when compiling, this can be the cause." )
endif()
if( CMAKE_BINARY_DIR MATCHES " " )
    message( "Your Build Directory contains spaces. If you experience problems when compiling, this can be the cause." )
endif()

file(GLOB SOURCES "external/myCustomHeaders/*.cpp")






add_library(loaders SHARED ${SOURCES}
${SDL2_INCLUDE_DIR}
external/SDL2_image-2.0.4/SDL_image.h
external/myCustomHeaders/include/loadTexture.h
external/myCustomHeaders/loadTexture.cpp
/usr/include/SDL2/SDL.h
/usr/include/SDL/SDL_image.h
external/SDL2_mixer-2.0.4/SDL_mixer.h
external/zlib-1.2.11/zlib.h
external/libpng-1.6.37/png.h
)
find_package(ZLIB)
if (ZLIB_FOUND)
     include_directories(external/zlib-1.2.11)
    #target_link_libraries(loaders ${ZLIB_LIBRARIES})
 endif()

if (!PNG_FOUND)
     message(STATUS "PNG not FOUND Don't use it")
 endif()

if(!ZLIB_FOUND)
     message(STATUS "ZLIB not FOUND")
endif()


include_directories(ZLIB external/zlib-1.2.11)
include_directories(PNG_INCLUDE_DIRS external/libpng-1.6.37)
include_directories( external/myCustomHeaders/include )
include_directories( external/SDL2_mixer-2.0.4/acinclude )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}external/SDL2_mixer-2.0.4 )
include_directories(/usr/include/SDL2)
include_directories(/usr/include/SDL)
include_directories(${SDL2_INCLUDE_DIRS})
include_directories(/usr/include)

include(FindPackageHandleStandardArgs)


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


link_directories(external/myCustomHeaders/include)
link_directories(external/myCustomHeaders)
link_directories(external/SDL2_mixer-2.0.4)
link_directories(/usr/include/SDL2)
link_directories(/usr/include/SDL)
link_directories(/usr/include)
link_directories(external/libpng-1.6.37)
link_directories(ZLIB external/zlib-1.2.11)
add_subdirectory (external)


# On Visual 2005 and above, this module can set the debug working directory
cmake_policy(SET CMP0026 OLD)
#cmake_policy(SET CMP0079  NEW)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external/rpavlik-cmake-modules-fe2273")
include(CreateLaunchers)
include(MSVCMultipleProcessCompile) # /MP

if(INCLUDE_DISTRIB)
    add_subdirectory(distrib)
endif(INCLUDE_DISTRIB)



include_directories(
    external/AntTweakBar-1.16/include/
    external/glfw-3.1.2/include/
    external/glm-0.9.7.1/
    external/glew-1.13.0/include/
    external/assimp-3.0.1270/include/
    external/bullet-2.81-rev2613/src/
    external/myCustomHeaders/include
    common/
)

set(ALL_LIBS
    ${OPENGL_LIBRARY}
    glfw
    GLEW_1130
    loaders

)



add_definitions(
    -DTW_STATIC
    -DTW_NO_LIB_PRAGMA
    -DTW_NO_DIRECT3D
    -DGLEW_STATIC
    -D_CRT_SECURE_NO_WARNINGS
)

# Tutorial 17
add_executable(mageengine
${SDL2_LIBRARY}
    Mafic/mafic.cpp
    common/shader.cpp
    common/shader.hpp
    common/controls.cpp
    common/controls.hpp
    common/texture.cpp
    common/texture.hpp
    common/objloader.cpp
    common/objloader.hpp
    common/vboindexer.cpp
    common/vboindexer.hpp
    common/quaternion_utils.cpp
    common/quaternion_utils.hpp
    Mafic/StandardShading.vertexshader
    Mafic/StandardShading.fragmentshader

)
target_link_libraries(loaders
                       -lSDLmain)
target_link_libraries(loaders
                       -lSDL)
        target_link_libraries(loaders
                       -lSDL2_ttf)
target_link_libraries(loaders ${ZLIB_LIBRARIES})
target_link_libraries(loaders
                       -lSDL2_mixer)
target_link_libraries(loaders -zlib)
target_link_libraries(loaders ${PNG_LIBRARIES})


set_target_properties(loaders
   PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(loaders ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES})


target_link_libraries(mageengine
    ${ALL_LIBS}
    ANTTWEAKBAR_116_OGLCORE_GLFW
    ${SDL2_LIBRARIES}

   loaders
)

set_target_properties(mageengine PROPERTIES XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Mafic/")
create_target_launcher(mageengine WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Mafic/")

SOURCE_GROUP(common REGULAR_EXPRESSION ".*/common/.*" )
SOURCE_GROUP(shaders REGULAR_EXPRESSION ".*/.*shader$" )


if (NOT ${CMAKE_GENERATOR} MATCHES "Xcode" )

add_custom_command(
   TARGET mageengine POST_BUILD
   COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mageengine${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_SOURCE_DIR}/Mafic/"
)
  #target_link_libraries(mageengine LINK_PUBLIC ${mylibrary}
  # )

elseif (${CMAKE_GENERATOR} MATCHES "Xcode" )

endif (NOT ${CMAKE_GENERATOR} MATCHES "Xcode" )


我希望我的程序不会崩溃,以便我可以进一步实现和调试代码。

这是输出,充满可爱但有用的信息。

 aaron@Zog:~/Desktop/maficengine/Mafic$ ./mageengine 
LoadTexture object got constructed in mageengine from loadtexture.cpp
Reading image ./paint.bmp
Compiling shader : StandardShading.vertexshader
Compiling shader : StandardShading.fragmentshader
Linking program
Loading OBJ file plane.obj...
loadtexture() function works, inboundtexture is 1
ERROR(AntTweakBar) >> Parsing error in def string: Unknown attribute [true            ...]
Compiling shader : StandardShading.vertexshader
Compiling shader : StandardShading.fragmentshader
Linking program
Loading OBJ file plane.obj...
passed sdl init everything
passed sdl init
entered load files
likely opened file background.png
entered load image files
image image should be set
loaded image isn't null, hooray!
Segmentation fault (core dumped)

按照下面的 cmets 中的建议清理后更新的 cmakelists.text




# CMake entry point
cmake_minimum_required (VERSION 3.0)


project (maficengine LANGUAGES C CXX ASM)




set(CMAKE_MODULE_PATH "/home/aaron/Desktop/maficengine/cmake/")
find_package(PNG REQUIRED)
find_package(ZLIB  REQUIRED)
find_package(OpenGL REQUIRED)
find_package(SDL2 REQUIRED)
find_package(SDL_image REQUIRED)#  maybe sdl2_image
find_package(SDL_mixer REQUIRED)
#set(CMAKE_MODULE_PATH "/home/aaron/Desktop/maficengine/cmake/")

#et(SDL2_mixer_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
add_definitions(${PNG_DEFINITIONS})


include_directories(
  ${PNG_INCLUDE_DIRS}
  ${SDL2_INCLUDE_DIRS}
  ${SDL_MIXER_INCLUDE_DIR}
  ${SDL2_TTF_INCLUDE_DIRS}
  ${SDL_IMAGE_INCLUDE_DIRS}
  ${SDL2_IMAGE_INCLUDE_DIR}
)


file(GLOB_RECURSE SOURCE_FILES/usr/lib/x86_64-linux-gnu
    ${CMAKE_SOURCE_DIR}/src/*.c
    ${CMAKE_SOURCE_DIR}/src/*.cpp)

#include(FindSDL)


if( CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR )
    message( FATAL_ERROR "Please select another Build Directory ! (and give it a clever name, like bin_Visual2012_64bits/)" )
endif()
if( CMAKE_SOURCE_DIR MATCHES " " )
    message( "Your Source Directory contains spaces. If you experience problems when compiling, this can be the cause." )
endif()
if( CMAKE_BINARY_DIR MATCHES " " )
    message( "Your Build Directory contains spaces. If you experience problems when compiling, this can be the cause." )
endif()



#add_library(loaders

#external/myCustomHeaders/include/loadTexture.h
#external/myCustomHeaders/loadTexture.cpp

#)



if (ZLIB_FOUND)
     include_directories(external/zlib-1.2.11)
     message(STATUS "ZLIB FOUND")
  elseif (!ZLIB_FOUND)
     message(STATUS "Zlib not FOUND!")
endif()

if (PNG_FOUND)
     message(STATUS "PNG FOUND ")
   elseif (!PNG_FOUND)
     message(STATUS "PNG not FOUND! ")
endif()

#if(SDL_FOUND)
 #    message(STATUS "sdl LIB  FOUND!")
   #elseif(!SDL_FOUND)
  #   message(STATUS "sdl LIB not FOUND!")
#endif()

if(SDL2_FOUND)
     message(STATUS "sdl2  FOUND")
   elseif(!SDL2_FOUND)
     message(STATUS "sdl2  not FOUND!")
endif()

if(SDL_MIXER_FOUND)
     message(STATUS "sdl mixer  FOUND")
   elseif(!SDL_MIXER_FOUND)
     message(STATUS "sdl mixer not FOUND!")
endif()

if(SDL_IMAGE_FOUND)
     message(STATUS "sdl image  FOUND")
   elseif(!SDL_IMAGE_FOUND)
     message(STATUS "sdl image not FOUND!")
endif()



include_directories( external/myCustomHeaders/include )

include_directories(/usr/include)

include(FindPackageHandleStandardArgs)





#link_directories(external/myCustomHeaders/include)
#link_directories(external/myCustomHeaders)
link_directories(external/SDL2_mixer-2.0.4)
link_directories(/usr/include/SDL2)
link_directories(/usr/include/SDL)
link_directories(/usr/include)
link_directories(external/libpng-1.6.37)
link_directories(ZLIB external/zlib-1.2.11)
add_subdirectory (external)


# On Visual 2005 and above, this module can set the debug working directory
cmake_policy(SET CMP0026 OLD)


list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external/rpavlik-cmake-modules-fe2273")
include(CreateLaunchers)
include(MSVCMultipleProcessCompile) # /MP

if(INCLUDE_DISTRIB)
    add_subdirectory(distrib)
endif(INCLUDE_DISTRIB)



include_directories(
    external/AntTweakBar-1.16/include/
    external/glfw-3.1.2/include/
    external/glm-0.9.7.1/
    external/glew-1.13.0/include/
    external/assimp-3.0.1270/include/
    external/bullet-2.81-rev2613/src/
    external/myCustomHeaders/include
    common/
)

set(ALL_LIBS
    ${OPENGL_LIBRARY}
    glfw
    GLEW_1130
    #loaders
 ${SDL2_LIBRARIES}
 ${SDL2_IMAGE_LIBRARIES}
 ${SDL2_MIXER_LIBRARIES}
 ${SDL2_TTF_LIBRARIES}
)



add_definitions(
    -DTW_STATIC
    -DTW_NO_LIB_PRAGMA
    -DTW_NO_DIRECT3D
    -DGLEW_STATIC
    -D_CRT_SECURE_NO_WARNINGS
)

# Tutorial 17
add_executable(mageengine
#${SDL2_LIBRARY}
    Mafic/mafic.cpp
    common/shader.cpp
    common/shader.hpp
    common/controls.cpp
    common/controls.hpp
    common/texture.cpp
    common/texture.hpp
    common/objloader.cpp
    common/objloader.hpp
    common/vboindexer.cpp
    common/vboindexer.hpp
    common/quaternion_utils.cpp
    common/quaternion_utils.hpp
    Mafic/StandardShading.vertexshader
    Mafic/StandardShading.fragmentshader

)
target_link_libraries(mageengine
                       -lSDLmain)
target_link_libraries(mageengine
                      -lSDL)
    #    target_link_libraries(loaders
 #                      -lSDL2_ttf)
#target_link_libraries(loaders ${ZLIB_LIBRARIES})
target_link_libraries(mageengine
                      -lSDL2_mixer)
#(loaders -zlib)
#target_link_libraries(loaders ${PNG_LIBRARIES})


set_target_properties(mageengine
   PROPERTIES LINKER_LANGUAGE CXX)
#target_link_libraries(loaders ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES})


target_link_libraries(mageengine
    ${ALL_LIBS}
    ANTTWEAKBAR_116_OGLCORE_GLFW

)

set_target_properties(mageengine PROPERTIES XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Mafic/")
create_target_launcher(mageengine WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Mafic/")

SOURCE_GROUP(common REGULAR_EXPRESSION ".*/common/.*" )
SOURCE_GROUP(shaders REGULAR_EXPRESSION ".*/.*shader$" )


if (NOT ${CMAKE_GENERATOR} MATCHES "Xcode" )

add_custom_command(
   TARGET mageengine POST_BUILD
   COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mageengine${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_SOURCE_DIR}/Mafic/"
)


elseif (${CMAKE_GENERATOR} MATCHES "Xcode" )

endif (NOT ${CMAKE_GENERATOR} MATCHES "Xcode" )

【问题讨论】:

  • 虽然 C++ 代码非常小而具体,但 CMakeLists.txt 只是一个垃圾。它使用多种方法一次检测 SDL2 库:find_package(SDL2)find_library、硬编码路径、PKG_SEARCH_MODULE(SDL2)。每个新方法都重新定义了前一个方法设置的变量。此外,您显示的CMakeLists.txt 根本不起作用。例如。它在add_library 调用中使用目录${SDL2_INCLUDE_DIR},它使用find_path( SDL_MIXER_INCLUDE_DIR ...) 没有搜索的标题名称等等。请提供工作 CMakeLists.txt.
  • SDL2 中没有SDL_DisplayFormat。从您的 cmakefile 看来,您正在与 SDL2SDL (和 SDLmain)链接 - 它从来没有想过以这种方式工作。只使用一个。
  • 感谢您的帮助。我已经在一定程度上清理了 cmakelists .text,如果我能写一个合适的功能,我可能不会在这里。但是教程让它看起来很容易粘贴 6 行代码.. 但它对我不起作用。到目前为止可能有 600 行没有运气。我不想研究 cmake、sdl 的每一个破碎的方面。 glwf、opengl 等等等。我只想链接到一个声音库。我想继续游戏设计。但看起来我会为未来设计的每一个狡猾的系统而苦恼。在这里不是真的在抱怨,只是为了娱乐价值而虚张声势。
  • 现在它看起来(我猜是(cmakelists.text))“正常”,它分段失败并崩溃。当我调用 sdl 函数时。现在,我链接的大多数或所有库似乎正在加载。找到的库至少返回 true。但是我也可以在汽车上找到引擎,并不意味着我参与了这种方式或准备让它们工作。我让 sdl 窗口沿着我的 opengl 窗口打开。但是还不能播放音乐或音效。我的印象是 SDL 易于使用。我想大公司有资本支付内部资金来设置他们的东西
  • 我已经更新了 cmakelists.text 并通过编辑添加了上面的新版本。我也会发布我的 .cpp,所以也许我们可以看到导致崩溃的原因。我需要一点时间来清理它,这样它就不会那么垃圾了。

标签: c++ cmake linker png sdl


【解决方案1】:

最后...再次为我的游戏引擎尝试了 SDL 声音库 .... 并找到了解决方法!!!,声音很好...现在清晰如铃,但我仍然认为我必须添加sdl_mixer 库来满足。但这次我想我可以做到。我发现一个旧博客让我朝着正确的方向前进。我想我安装了 SDL 然后升级到开发库,但这是错误的顺序,然后我无法正确清除旧库,但更深入地挖掘并添加了工具来跟踪、销毁和处理文件和符号,直到......魔术发生......完全难以置信地难以做到。这是向我发送正确方式的博客->

“如果您构建了自己的 SDL,您可能没有开发头文件 对于 PulseAudio(或 ALSA),所以它试图使用 /dev/dsp,但它没有 存在于许多现代 Linux 系统上(因此,SDL_Init(SDL_INIT_AUDIO) 成功,但当您尝试打开一个设备时未找到任何设备)。 “apt-get 安装 libasound2-dev libpulse-dev" 并重建 SDL ...让配置 脚本找到新的标头,因此它包含 PulseAudio 和 ALSA 支持。 "

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2015-08-18
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多