LINUX.ORG.RU

SDL + minGW


0

0

Люди поясните дураку что я делаю не так плиз !
Имеем MinGW-3.1.0-1 и SDL-devel-1.2.6-mingw32.tar.gz
minGW компилит нормально, берем SDL, пишем:
g++ -Dmain=SDL_main -I %SDL_include% -L %SDL_library% -lmingw32 -lSDLmain -lSDL -mwindows -luser32 -lgdi32 -lwinmm -ldxguid -o test001 test001.cpp

И получаем:
C:\WINDOWS\TEMP/ccWrPggb.o(.text+0x8d):test001.cpp: undefined reference to `SDL_
SetVideoMode'
C:\WINDOWS\TEMP/ccWrPggb.o(.text+0xcc):test001.cpp: undefined reference to `SDL_
Delay'

Вот test.cpp:

#include <stdlib.h>
#include <SDL.h>

int main(int argc, char *argv[])
{
SDL_Surface *screen;
if(SDL_Init(SDL_INIT_VIDEO) == -1)
{
printf("Can't init SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);
if(screen == NULL)
{
printf("Can't set video mode: %s\n", SDL_GetError());
exit(1);
}
SDL_Delay(3000);
return 0;
}

Ну и какого ему надо ?

anonymous

Хммм... Я SDL скомпилировал себе под MinGW сразу из исходников, не 
пользуясь пакетом devel и проблем не было.

Но когда собираю проги пользуюсь примерно такой командой:
gcc `sdl-config --cflags` source.c -o source.c
gcc -o program.exe source.o `sdl-config --libs`

Т.е. стоит наверное пользоваться прогой sdl-config.

Да, еще SDL.h надо подключать не угловыми скобками,
а двойными кавычками:
#include "SDL.h"

это написано у них на сайте, четь ли не на главной страничке.

fuxx
()
Ответ на: комментарий от fuxx

Чтобы сделать gcc `sdl-config --cflags` source.c -o source.c
Нужен sh. Его в minGW нет. Я ж под масдаем mingw пользую...
Тем более что все эти -mwindows -luser32 -lgdi32 -lwinmm -ldxguid
как раз из sdl-config и взяты. Не врубаюсь что не так ?

Насчет угловых скобок/кавычек тут все верно. Когда ты делаешь include с угловыми скобками компилятор ищет хедер среди своих системных хедеров и хедеров пути к которым добавлены с помощью опции -I.
Когда ты делаешь include с кавычками компилятор ущет хедер сначала в текущем каталоге а если не нашел, тогда среди системных хедеров и хедеров пути к которым добавлены с помощью опции -I.

anonymous
()

Нет это фигня какая-то... Упрощаем пример.
Берем каталог кидаем туда libSDLmain.a libSDL.a и все хедеры от SDL-devel-1.2.6-mingw32.tar.gz

Создаем примитивный test001.cpp:

#include "SDL.h"

int main()
{
if(SDL_Init(SDL_INIT_VIDEO) == -1)
{
return -1;
}
return 0;
}

Компилим:

g++ -lmingw32 -mwindows -luser32 -lgdi32 -lwinmm -ldxguid libSDLmain.a libSDL.a -o test001 test001.cpp


Получаем:

libSDLmain.a(SDL_main.o.b)(.text+0x35a): In function `console_main': 10:53 /home/hercules/release/SDL-1.2.6/src/main/SDL_main.c:251: undefined reference to `SDL_main'

Используеться масдайный MinGW-3.1.0-1 (gcc version 3.2.3 (mingw special 20030504-1)

Помогите плиз ! Чего не хватает-то ?

anonymous
()
Ответ на: комментарий от anonymous

> Чтобы сделать gcc `sdl-config --cflags` source.c -o source.c
> Нужен sh. Его в minGW нет. Я ж под масдаем mingw пользую...
Ты поставил MinGW без MSYSа? Зачем?

> Тем более что все эти -mwindows -luser32 -lgdi32 -lwinmm -ldxguid
> как раз из sdl-config и взяты. Не врубаюсь что не так ?
Они совершенно бесполезны, если к этим библиотекам не прописан путь
в переменной среды PATH.

> Насчет угловых скобок/кавычек тут все верно
Вот кусок из FAQа на сайте SDL
http://www.libsdl.org/faq.php?action=listentries&category=2#19

Q:Do I #include <SDL.h> or <SDL/SDL.h>?
A:The most portable way to include SDL headers is to
use quotes around the header name:

#include "SDL.h"

fuxx
()
Ответ на: комментарий от fuxx

>>Ты поставил MinGW без MSYSа? Зачем?
Оно и так работает, хотя я вчера уже доставил MSYS.

>>Они совершенно бесполезны, если к этим библиотекам не прописан путь
>>в переменной среды PATH.
PATH то тут причем ? -L для этого есть.

Смотри я привел еще один, упрощенный до предела и взял примитивный пример из одной функции, библиотеки и хедеры кинул к нему,
использую "SDL.h", библиотеки подключаю явно - и шишь. Линкеру явно не хватает какой-то библиотеки.

anonymous
()
Ответ на: комментарий от anonymous

> Смотри я привел еще один, упрощенный до предела и взял примитивный 
> пример из одной функции, библиотеки и хедеры кинул к нему,
> использую "SDL.h", библиотеки подключаю явно - и шишь.
> Линкеру явно не хватает какой-то библиотеки.
Все очень просто. Используй в этом примере _правильную_ сигнатуру
функции main и все заработает. Об этом сказано в сообщении ошибке
которое ты привел.
Правильная сигнатура main - 

int main( int argc, char *argv[]);

а вот libSDL.a и -lSDL это одно и то же.

Еще замечание - библиотеки стоит перечислять _после_ имен файлов
исходников.

Еще раз скажу - поставь MSYS, скачай исходники SDL, а дальше
./configure
make
make install

а компилять с sdl-configом.
Т.е. примерно так:
g++ -c src.c `sdl-config --cflags` -o src.o
g++ -o program src.o `sdl-config --libs`

Успехов! Скоро мы будем рубать в твою игрушку?!

fuxx
()
Ответ на: комментарий от fuxx

Знаешь ты прав ему это и было нужно (перечисление библиотек после сырца и другое объявление main).
Мда... Ну порядок перечисления это фича, но объявление ТОЛЬКО такое
функции main однозначный баг - тк стандарт допускает кроме
int main (int argc, char* argv[]) так же и int main(void)...

>>а вот libSDL.a и -lSDL это одно и то же.
Нет. Если линкеру указано -lSDL и в доступном линкере каталоге он видит libSDL.a и libSDL.so он ОДНОЗНАЧНО выбирает libSDL.so
поэтому я и написал явно libSDL.a

>>Успехов! Скоро мы будем рубать в твою игрушку?!
Спасибо что подсказал ! Для начала если все нормально пойдет воплотим
давно задуманный римейк одной игры с одного забытого копьютера :)

anonymous
()
Ответ на: комментарий от anonymous

Я так понял что libSDLmain.a есть
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)

которая вызывает в конечном итоге пытаеться вызвать
мою int main(int argc, char* argv[])

Мда...

anonymous
()
Ответ на: комментарий от anonymous

> Мда... Ну порядок перечисления это фича, но объявление ТОЛЬКО такое
> функции main однозначный баг - тк стандарт допускает кроме
> int main (int argc, char* argv[]) так же и int main(void)...
Cтандарт это одно, а в libSDL используется только один вариант. Это их
право, потому что стандарт на libSDL они делают сами.
Если в linux это проходит незаметно, то в винде к замангленному имени
в либе добавляется список аргументов даже в Си.

> Нет. Если линкеру указано -lSDL и в доступном линкере каталоге он 
> видит libSDL.a и libSDL.so он ОДНОЗНАЧНО выбирает libSDL.so
> поэтому я и написал явно libSDL.a
libSDL.so в винде нет, там есть libSDL.dll, с которым нельзя 
линковаться напрямую для этого используются библиотеки импорта с 
расширением .a. Это вовсе не означает что ты не можешь сделать
статическую версию libSDL.a, которая вовсе не будет библиотекой
импорта. Посмотри в каталог c:\MinGW\lib, там есть библиотеки
импорта и для kernel32.dll и для user32.dll и все-такое прочее.


fuxx
()
Ответ на: комментарий от fuxx

я не знаю что такое mingw, но сибилдер отлично собирает sdl

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
SDL_Init(SDL_INIT_VIDEO);

return 0;
}

bcc32 -tWR SDL.lib main.c

все ок

anonymous
()
Ответ на: комментарий от anonymous

тупой вопрос по find

Спасибо, я разобрался. Нужно определять main со всеми аргументами и указывать библиотеки после сырца.
Про include все так-же как я говорил, естественно. Добавляем -I и
спокойно юзаем include<SDL.h>

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.