我在寻找编译使用C++程序最简单的方法SDL2和SDL_image与cmake的.
经过几个小时的搜索后,这是我最好的尝试:
的CMakeLists.txt
project(shooter-cmake2)
cmake_minimum_required(VERSION 2.8)
set(SOURCES
shooter.cpp
classes.cpp
utils.cpp
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
add_executable(${PROJECT_NAME} ${SOURCES})
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2_image REQUIRED sdl2_image)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
In function `loadTexture(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, SDL_Renderer*)':
undefined reference to `IMG_LoadTexture'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这是函数调用:
#include "SDL.h"
#include "SDL_image.h"
SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){
SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
texture != nullptr or die("LoadTexture");
return texture;
}
Run Code Online (Sandbox Code Playgroud)
我很绝望.请帮我!谢谢!:)
我一直试图为我的游戏生成一个静态链接的"单二进制"版本的Windows.我想链接sdl,sdl_image和sdl_mixer,这反过来又引入了一些支持库.不幸的是我还没有找到一种方法来使用cygwin/mingw/gcc来编译和链接.据我所知,所有现有的公共版本只是共享库/ dll.
请注意,我不是在谈论许可.源将是开放的,因此sdl的GPL/LGPLness无关紧要.
我目前正在尝试使用SDL和Box2D进行简单的游戏.不幸的是,我添加的代码使角色拍摄proyectiles非常麻烦我甚至无法开始计算错误.为了解决这个问题,我添加了一些代码来显示游戏中的一些调试信息.不幸的是,在处理了所有错误之后,出现了一个奇怪的错误,这个错误在弹出之前没有出现:
/usr/include/SDL/SDL_image.h|34|error: expected initializer before ‘extern’|
||=== Build finished: 1 errors, 0 warnings ===|
Run Code Online (Sandbox Code Playgroud)
SDL_image.h中导致此问题的代码是:
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)
我不知道是什么原因导致出现此错误消息,或者如何解决此问题.我的代码上没有错误消息.我不认为图书馆有任何问题,因为我做的其他游戏只编译文件.这是弹出的唯一错误.
我将一个object(TTF_Font)存储在shared_ptr从第三方API提供给我的对象中.我不能在对象上使用new或delete,因此shared_ptr也提供了一个"freeing"仿函数.
// Functor
struct CloseFont
{
void operator()(TTF_Font* font) const
{
if(font != NULL) {
TTF_CloseFont(font);
}
}
};
boost::shared_ptr<TTF_Font> screenFont;
screenFont = boost::shared_ptr<TTF_Font>( TTF_OpenFont("slkscr.ttf", 8), CloseFont() );
Run Code Online (Sandbox Code Playgroud)
如果,稍后,我需要明确释放此对象,这样做是正确的:
screenFont.reset();
Run Code Online (Sandbox Code Playgroud)
然后让screenFont(实际shared_ptr物体)自然地被摧毁?
我正在尝试编译以下具有标题的代码:
#include <SDL2/SDL.h>
#include <SDL2_image/SDL_image.h>
Run Code Online (Sandbox Code Playgroud)
但是在运行以下 makefile 后:
g++ -std=c++11 src/main.cpp -lSDL2 -lSDL2_image
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
fatal error: SDL2_image/SDL_image.h: No such file or directory
#include <SDL2_image/SDL_image.h>
Run Code Online (Sandbox Code Playgroud)
有什么建议?不完全确定我安装的 SDL_image。我在 Ubuntu 上运行这个。
每当我尝试使用SDL_Image的IMG_Load函数加载PNG时,它都会给出错误Failed loading libpng16-16.dll:.我在正确的路径中有所有正确的dll,我可以使用SDL_Image的其他部分,但由于某种原因,它无法加载libpng dll.我怎样才能解决这个问题?任何帮助表示赞赏.
我正在通过 Lazy Foo 的教程学习 SDL,但我无法继续进行,因为 IMG_Load 似乎不起作用。我尝试按照他说的那样进行设置,但它不起作用。我将所有包含文件放入 include 文件夹中,将所有 lib 文件放入 lib 文件夹中。我发现lib文件夹中有x86和x64文件夹。当我尝试 x64 时(因为我有一个 64 位系统),一切都工作正常,CodeBlocks 甚至告诉我建议(比如当我写“img”时,它显示了一个建议“IMG_Load”(这意味着库已初始化?)) ,但是当我编译代码时,会发生这种情况: http: //puu.sh/3Eqa5.png。当我尝试使用 x86 版本时,出现完全相同的错误。
我在网上查了一下,只找到了一些线索,但大多数都被放弃了。我最接近回答我的问题的是: http: //www.dreamincode.net/forums/topic/118299-sdl-image-error-sdl/,但这家伙通过下载一个Linux可以使用的问题解决了他的问题,不是Windows。}
我运行的是 Windows 7 64 位、CodeBlocks 12.11、SDL 1.2.15 和 SDL_Image 1.2.12。
我真的不知道问题是什么!
我有以下脚本:
gcc -I /Library/Frameworks/SDL2.framework/Headers \
-F /Library/Frameworks/ -framework SDL2 test.c
Run Code Online (Sandbox Code Playgroud)
成功编译了以下源代码:
#include <SDL.h>
//#include "SDL_image.h"
int init();
int loadMedia();
void close();
SDL_Window* gWindow = NULL;
SDL_Surface* gScreenSurface = NULL;
SDL_Surface* gHelloWorld = NULL;
int init()
{
int success = 1;
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
}
}
int main(int argc, char* args[])
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使用添加的库 SDL_image 来编译它?会是这样的吗?
gcc -I /Library/Frameworks/SDL2.framework/Headers \
-I /Library/Frameworks/SDL_image.framework/Headers \
-F /Library/Frameworks/ -framework SDL2 test.c
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,我收到以下错误:
In file …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SDL 制作一个应用程序,我想在我的窗口上添加一个图标,但是当我编译时,我收到此错误:
\n\nerror: \xe2\x80\x98IMG_Load\xe2\x80\x99 was not declared in this scope\n SDL_Surface * icon_surface = IMG_Load(icon);\n ^\nRun Code Online (Sandbox Code Playgroud)\n\n我正在使用cmake和make进行编译,这里是CMakeLists.txt
\n\ncmake_minimum_required (VERSION 2.6)\n\nset(PROJECT_NAME "Engine")\n\n\nproject (${PROJECT_NAME})\n\n\nSET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c++0x")\n\nif( CMAKE_SIZEOF_VOID_P EQUAL 8 )\n\n MESSAGE( "64 bits compiler detected" )\n SET( EX_PLATFORM 64 )\n SET( EX_PLATFORM_NAME "x64" )\n\n SET( EXECUTABLE_NAME ${PROJECT_NAME}-x64 )\n\nelse( CMAKE_SIZEOF_VOID_P EQUAL 8 ) \n\n MESSAGE( "32 bits compiler detected" )\n SET( EX_PLATFORM 32 )\n SET( EX_PLATFORM_NAME "x86" )\n\n SET( EXECUTABLE_NAME ${PROJECT_NAME}-x86 )\n\nendif( CMAKE_SIZEOF_VOID_P EQUAL …Run Code Online (Sandbox Code Playgroud) 我正在尝试将SDL的"窗口"中的屏幕或框架保存到PNG文件中,因此我正在使用SDL_image库.我的代码如下
IMG_Init(Int32(IMG_INIT_PNG.rawValue))
let screenShot = SDL_CreateRGBSurface(0, 640, 480, 32, 0, 0, 0, 0)
SDL_SetRenderTarget(renderer, texture)
SDL_RenderReadPixels(renderer, nil, Uint32(SDL_PIXELFORMAT_ARGB8888), screenShot?.pointee.pixels, (screenShot?.pointee.pitch)!)
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
IMG_SavePNG(screenShot, "\(documentsPath)/image.png")
SDL_FreeSurface(screenShot)
Run Code Online (Sandbox Code Playgroud)
但是image.png没有得救.如果有人可以带领或帮助我.谢谢!
附加代码,保存的图像只是黑色
IMG_Init(Int32(IMG_INIT_PNG.rawValue))
let screenShot = SDL_CreateRGBSurface(Uint32(SDL_SWSURFACE), 640, 480, 32, 0, 0, 0, 0)
// SDL_SetRenderTarget(renderer, texture)
SDL_RenderReadPixels(renderer, nil, Uint32(SDL_PIXELFORMAT_ARGB8888), screenShot?.pointee.pixels, (screenShot?.pointee.pitch)!)
// Save to documents directory
let fileManager = FileManager.default
do {
let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) …Run Code Online (Sandbox Code Playgroud)