Pygame не может найти включаемый файл "sdl.h" - PullRequest
3 голосов
/ 09 мая 2009

Я пытаюсь создать загруженное приложение Python для Windows, которое использует Pygame. Я установил Python 2.5 и Pygame 1.7.1. Я новичок в Python, но я просто попытался ввести имя .py файла верхнего уровня в командной строке консоли Windows. (Я использую Win XP Pro.)

Это сообщение, которое я получаю.

C: \ Python25 \ include \ pygame \ pygame.h (68): фатальная ошибка C1083: не удается открыть, включить file: 'SDL.h': нет такого файла или каталога

Я подумал, что Pygame был построен поверх SDL и что отдельная установка SDL не нужна. Тем не менее я установил SDL 1.2.13 и добавил папку включения SDL в свою переменную среды% INCLUDE%. Все еще не повезло.

Я заметил, что C: \ Python25 \ Lib \ site-packages \ pygame включает в себя несколько файлов SDL * .DLL, но в дереве питонов нет ни одного заголовочного файла sdl.h. Конечно, я мог бы скопировать заголовки sdl в папку C: \ Python25 \ include \ pygame , но это неприятная идея.

Кто-нибудь знает, как правильно все настроить?

EDIT: Приложение "Пингвин машина" приложение-пигмея .

Ответы [ 2 ]

3 голосов
/ 09 мая 2009

Я попытался скомпилировать и получил те же ошибки на моем linux box:

$ python setup.py build
DBG> include = ['/usr/include', '/usr/include/python2.6', '/usr/include/SDL']
running build
running build_ext
building 'surfutils' extension
creating build
creating build/temp.linux-i686-2.6
creating build/temp.linux-i686-2.6/src
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include -I/usr/include/python2.6 -I/usr/include/SDL -I/usr/include/python2.6 -c src/surfutils.c -o build/temp.linux-i686-2.6/src/surfutils.o
In file included from src/surfutils.c:1:
/usr/include/python2.6/pygame/pygame.h:68:17: error: SDL.h: Arquivo ou diretório inexistente
In file included from src/surfutils.c:1:
/usr/include/python2.6/pygame/pygame.h:312: error: expected specifier-qualifier-list before ‘SDL_VideoInfo’
/usr/include/python2.6/pygame/pygame.h:350: error: expected specifier-qualifier-list before ‘SDL_Surface’
src/surfutils.c:5: error: expected ‘)’ before ‘*’ token
src/surfutils.c: In function ‘PyCollisionPoint’:
src/surfutils.c:74: error: ‘SDL_Surface’ undeclared (first use in this function)
src/surfutils.c:74: error: (Each undeclared identifier is reported only once
src/surfutils.c:74: error: for each function it appears in.)
src/surfutils.c:74: error: ‘surf1’ undeclared (first use in this function)
src/surfutils.c:74: error: ‘surf2’ undeclared (first use in this function)
src/surfutils.c:74: warning: left-hand operand of comma expression has no effect
src/surfutils.c:92: error: ‘PySurfaceObject’ has no member named ‘surf’
src/surfutils.c:97: error: ‘SDL_SRCALPHA’ undeclared (first use in this function)
src/surfutils.c:111: error: ‘PySurfaceObject’ has no member named ‘surf’
src/surfutils.c:161: warning: implicit declaration of function ‘collisionPoint’
error: command 'gcc' failed with exit status 1

Похоже, он пытается скомпилировать расширение с именем surfutils, для которого нужны заголовки разработки SDL.

Итак, я установил пакет libsdl1.2-dev с помощью моего менеджера дистрибутива, и он работал просто отлично. Вы должны установить заголовки разработки SDL, чтобы собрать его для своей системы.

Итак, ваш вопрос на самом деле таков: Как установить заголовочные файлы SDL для разработки в Windows и как заставить программу использовать их?

Ну, я могу ответить на второй вопрос. Вы должны отредактировать setup.py:

#!/usr/bin/env python2.3

from distutils.core       import setup, Extension
from distutils.sysconfig  import get_config_vars

includes = []
includes.extend(get_config_vars('INCLUDEDIR'))
includes.extend(get_config_vars('INCLUDEPY'))
includes.append('/usr/include/SDL')

print 'DBG> include =', includes

setup(name='surfutils',
      version='1.0',
      ext_modules=[Extension(
                    'surfutils', 
                    ['src/surfutils.c'], 
                    include_dirs=includes,
                  )],
     )

Изменить строку 9. Там написано:

includes.append('/usr/include/SDL')

Измените этот путь, где бы ни находились ваши заголовки SDL, т. Е .:

includes.append(r'C:\mydevelopmentheaders\SDL')

Оставьте записку разработчику игры, чтобы сказать, что у вас возникли проблемы. Это может обеспечить лучший способ поиска заголовков SDL на вашей платформе.

1 голос
/ 09 мая 2009

Когда вы что-то компилируете, компилятор просматривает заголовочные файлы в нескольких каталогах, некоторые жестко запрограммированы и встроены, и, как правило, некоторые передаются в качестве аргументов компилятору (как, например, "gcc -I / usr / local / include ...") ). Одно предположение, что вам не хватает этого. Если нет, проверьте другие возможные причины вашего сообщения об ошибке .

Вам понадобится установить библиотеки разработки SDL , но поскольку вы говорите: «Я могу скопировать заголовки sdl», это звучит так, как будто вы уже это сделали. Тогда ваша проблема состоит только в том, чтобы заставить компилятор искать в каталоге include, содержащем эти файлы.

...