2014-12-01 3 views
0

С этой проблемой, так как я установил SDL. Прежде всего, я попытался установить его с tar.gz-файлом, не пошел нормально при попытке компиляции (терминал не смог найти dir для SDL lib), поэтому после этого я установил synpatic pack mng, и успешно загрузил файл «libsdl1.2-dev». Я следую руководству lazzy foo для SDL, всякий раз, когда я пытаюсь скомпилировать простой код для создания экрана и blit изображение, я получаю следующее сообщение в терминале:SDL - ошибка сегментации (ядро сбрасывается), любые мысли?

(gcc -Wall -o teste teste.c -lSDL -lSDL_image)

"ошибка сегментации (ядро сбрасывали)"

Здесь мой код в 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; 
    } 
  • Я уже убедился, что hello.bmp втот же самый каталог моего файла teste.c.

Вот лог с помощью GDB на трассировку:

LOG

GNU gdb (Ubuntu 7.8-1ubuntu4) 7.8.0.20141001-cvs 
Copyright (C) 2014 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from teste...(no debugging symbols found)...done. 
(gdb) run 
Starting program: /home/lazzo/Documentos/Treino/teste 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
[New Thread 0x7ffff707c700 (LWP 5605)] 

Program received signal SIGSEGV, Segmentation fault. 
SDL_Flip (screen=0x0) at ./src/video/SDL_video.c:1109 
1109 ./src/video/SDL_video.c: No such file or directory. 
(gdb) bt 
#0 SDL_Flip (screen=0x0) at ./src/video/SDL_video.c:1109 
#1 0x00000000004009a2 in main() 
(gdb) c 
Continuing. 
[Thread 0x7ffff7fd8740 (LWP 5601) exited] 

Program terminated with signal SIGSEGV, Segmentation fault. 
The program no longer exists. 
(gdb) q 
]0;[email protected]: ~/Documentos/[email protected]:~/Documentos/Treino$ exit 
exit 

КОНЕЦ LOG

Любая помощь вы, ребята могли бы дать мне бы очень ценна, и я прошу прощения за мой плохой английский, я из Бразилии и все еще изучаю английский.

UPDATE

После добавления Клас предложение на мой код, я получил от этого терминала:

"SDL_SetVideoMode не удалось: Нет Avaible видеоустройства"

Как это возможно? (Моя видеокарта является Radeon HD 4850 кстати)

+0

Синтаксис: $ gcc [опции] [исходные файлы] [файлы объектов] -o выходной файл – Vincent

+0

Выходное имя файла должно немедленно следовать за опцией -o. –

+0

Вызов 'SDL_SetVideoMode' возвращает' null'. Если вы получите возвращаемое значение «null», вы должны сразу вызвать «SDL_GetError», чтобы проверить, что такое ошибка. –

ответ

2

Проблема раунд 1 (сборник):

Целевого имя файл должен следовать сразу же после опции -o, так что вы должны изменить порядок аргументов:

gcc -Wall -o teste teste.c -lSDL -lSDL_image 

Это может не решить все проблемы с построением, но это хорошее начало.

Проблема раунд 2 (добавление обработки ошибок):

Вызов SDL_SetVideoMode возвращается нуль. Если вы получаете возвращаемое значение 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 вызовов.

+0

Спасибо, я изменил синтаксис, следуя этому точному порядку, но теперь, когда пытаюсь выполнить программу (./teste), все, что я получаю, это: «Ошибка сегментации (ядро сбрасывается)» – Lazzo

+0

@ Lazzo, который был бы отдельный вопрос (также вы должны посмотреть на использование 'gdb' или какого-нибудь другого отладчика) –

+0

Спасибо, я полностью отредактировал свой вопрос, чтобы он соответствовал новой проблеме, которую я получил. Я не вижу необходимости создавать целую новую страницу, так как у меня все еще есть проблемы. – Lazzo

0

Единственное, что получилось в моем случае, это отформатировать Ubuntu и попробовать другой дистрибутив. Сейчас я использую Linux Mint, и, несмотря на то, что он полностью основан на Ubuntu, все работает как ожидается. Просто поделитесь своим решением проблемы, если у кого-то еще будет такая же проблема.

Смежные вопросы