Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C SDL-分割错误(核心转储),有什么想法吗?_C_Ubuntu - Fatal编程技术网

C SDL-分割错误(核心转储),有什么想法吗?

C SDL-分割错误(核心转储),有什么想法吗?,c,ubuntu,C,Ubuntu,自从我安装了SDL后,出现了这个问题。首先,我尝试用tar.gz文件安装它,但在尝试编译时没有正常运行(terminal找不到SDL lib的目录),因此在这之后,我安装了语法包mng,并成功下载了“libsdl1.2-dev”文件。 我遵循lazzy foo的SDL教程,每当我试图编译一个简单的代码来创建屏幕和blit图像时,我在终端中得到以下消息: (gcc-Wall-o teste teste.c-lSDL-lSDL_图像) “分段故障(堆芯转储)” 这是我的C代码: #inclu

自从我安装了SDL后,出现了这个问题。首先,我尝试用tar.gz文件安装它,但在尝试编译时没有正常运行(terminal找不到SDL lib的目录),因此在这之后,我安装了语法包mng,并成功下载了“libsdl1.2-dev”文件。 我遵循lazzy foo的SDL教程,每当我试图编译一个简单的代码来创建屏幕和blit图像时,我在终端中得到以下消息:

(gcc-Wall-o teste teste.c-lSDL-lSDL_图像)

“分段故障(堆芯转储)”

这是我的C代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include "SDL/SDL.h" 

    int main( int argc, char* args[] ) 
    {
    SDL_Surface* hello = NULL;
    SDL_Surface* screen = NULL;

    SDL_Init(SDL_INIT_EVERYTHING);

    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

    if (screen == NULL) {
        printf("SDL_SetVideoMode failed: %s\n", SDL_GetError());
        exit(1); /* Unrecoverable error */
    }

    hello = SDL_LoadBMP("hello.bmp");

    SDL_BlitSurface(hello, NULL, screen, NULL);

    SDL_Flip(screen);

    SDL_Delay(2000);

    SDL_FreeSurface(hello);

    SDL_Quit();

    return 0;
    }
#包括
#包括
#包括“SDL/SDL.h”
int main(int argc,char*args[]
{
SDL_曲面*hello=NULL;
SDL_表面*屏幕=空;
SDL_Init(SDL_Init_EVERYTHING);
屏幕=SDL_设置视频模式(640、480、32、SDL_表面);
如果(屏幕==NULL){
printf(“SDL_SetVideoMode失败:%s\n”,SDL_GetError());
退出(1);/*不可恢复的错误*/
}
hello=SDL_LoadBMP(“hello.bmp”);
SDL_BlitSurface(你好,空,屏幕,空);
SDL_翻转(屏幕);
SDL_延迟(2000年);
SDL_自由曲面(您好);
SDL_退出();
返回0;
}
  • 我已经确定hello.bmp在teste.c文件的同一目录中
以下是使用gdb进行回溯的日志:

日志

GNU gdb(Ubuntu 7.8-1ubuntu4)7.8.0.20141001-cvs
版权所有(C)2014免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-linux-gnu”。
键入“显示配置”以获取配置详细信息。
有关错误报告说明,请参阅:
.
在线查找GDB手册和其他文档资源,网址为:
.
要获得帮助,请键入“帮助”。
键入“apropos word”以搜索与“word”相关的命令。。。
正在从测试中读取符号…(未找到调试符号)…已完成。
(gdb)运行
启动程序:/home/lazzo/Documentos/Treino/teste
[已启用使用libthread_db的线程调试]
使用主机libthread_db library“/lib/x86_64-linux-gnu/libthread_db.so.1”。
[新螺纹0x7ffff707c700(LWP 5605)]
程序接收信号SIGSEGV,分段故障。
SDL_翻转(屏幕=0x0)在./src/video/SDL_video.c:1109
1109./src/video/SDL_video.c:没有这样的文件或目录。
(gdb)英国电信
#在./src/video/SDL_video.c:1109处0 SDL_翻转(屏幕=0x0)
#1 0x00000000004009a2在主目录中()
(gdb)c
持续的。
[线程0x7ffff7fd8740(LWP 5601)已退出]
程序以信号SIGSEGV终止,分段故障。
该程序不再存在。
(gdb)q
]0;lazzo@J-Ubuntu:~/Documentos/Treinolazzo@J-Ubuntu:~/Documentos/Treino$exit
出口
日志末尾

如果你们能给我任何帮助,我将不胜感激,我为我的英语不好道歉,我来自巴西,仍在学习英语

更新

在我的代码中添加了Klas建议后,我从终端获得了以下信息:

“SDL_SetVideoMode失败:没有可用的视频设备”

这怎么可能呢?(我的视频卡是radeon HD 4850 btw)

第一轮问题(汇编):

目标文件名必须紧跟在-o选项之后,因此您应该更改参数的顺序:

gcc -Wall -o teste teste.c -lSDL -lSDL_image
这可能无法解决所有构建问题,但这是一个良好的开端

第二轮问题(添加错误处理):


SDL\u SetVideoMode
的调用返回null。如果返回值为null,则应在返回后立即调用SDL_GetError以检查错误:

screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
if (screen == NULL) {
    printf("SDL_SetVideoMode failed: %s\n", SDL_GetError());
    exit(1); /* Unrecoverable error */
}

您应该为其他SDL调用添加类似的处理。

在我的例子中,唯一有效的方法是格式化Ubuntu并尝试另一个发行版。现在我正在使用LinuxMint,尽管它完全基于Ubuntu,但现在一切都按照预期运行。只是分享我对这个问题的解决方案,以防有一天其他人也遇到同样的问题。

语法:$gcc[options][source files][object files]-o output filename应该立即跟随
-o
选项。调用
SDL\u SetVideoMode
返回
null
。如果您得到的返回值为
null
,您应该立即调用
SDL\u GetError
,检查错误是什么。谢谢您的回答。你介意指出我应该怎么做吗?请说到SDL,我真的是个新手,以防这还不清楚/我在我的答案中添加了一个例子。谢谢,我按照这个确切的顺序修改了语法,但是现在,当我尝试执行程序(./teste)时,我得到的是:“分段错误(内核转储)”@Lazzo,这是一个单独的问题(你也应该使用
gdb
或其他调试器)谢谢,我完全编辑了我的问题,以便它与我的新问题相匹配。我看不出有必要创建一个全新的页面,因为我仍然有问题。
screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
if (screen == NULL) {
    printf("SDL_SetVideoMode failed: %s\n", SDL_GetError());
    exit(1); /* Unrecoverable error */
}