LINUX.ORG.RU
ФорумTalks

Ненависти тред

 


0

1

Решил узнать что это за зверь такой - сдл. Делаю хеллоуворлд.

drull@drull-AOA150:~$ cat 1.cpp 
#include <SDL/SDL.h>

const int SCREEN_WIDTH= 240;
const int SCREEN_HEIGHT= 320;
const int SCREEN_BPP= 16;
Uint16 back_color;

SDL_Surface *screen= NULL;

int main(int argc, char **argv)
{
SDL_Init(SDL_INIT_VIDEO);

   screen= SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT,       SCREEN_BPP, SDL_SWSURFACE);

   if(screen== NULL) printf("Unable to SetVideoMode\n");
   else printf("VideoMode settings -Ok\n");

    back_color= SDL_MapRGB(screen->format, 128, 0, 0); 

   SDL_LockSurface(screen);

   SDL_FillRect (screen, NULL, back_color);

   SDL_UnlockSurface(screen);

   SDL_Flip(screen); // show screen


  SDL_Delay(3000);

   printf("Quiting SDL...\n");
   SDL_FreeSurface(screen);
   SDL_Quit();
return 0;
}

drull@drull-AOA150:~$ g++ -lSDL -o sdl 1.cpp 
/tmp/ccXh36Nv.o: In function `main':
1.cpp:(.text+0x11): undefined reference to `SDL_Init'
1.cpp:(.text+0x35): undefined reference to `SDL_SetVideoMode'
1.cpp:(.text+0x85): undefined reference to `SDL_MapRGB'
1.cpp:(.text+0x98): undefined reference to `SDL_LockSurface'
1.cpp:(.text+0xbb): undefined reference to `SDL_FillRect'
1.cpp:(.text+0xc8): undefined reference to `SDL_UnlockSurface'
1.cpp:(.text+0xd5): undefined reference to `SDL_Flip'
1.cpp:(.text+0xe1): undefined reference to `SDL_Delay'
1.cpp:(.text+0xfa): undefined reference to `SDL_FreeSurface'
1.cpp:(.text+0xff): undefined reference to `SDL_Quit'
collect2: ld returned 1 exit status

drull@drull-AOA150:~$ g++ -o sdl 1.cpp -lSDL
drull@drull-AOA150:~$ ls -l sdl 
-rwxrwxr-x 1 drull drull 7636 2012-09-18 02:00 sdl
Где логика, ГДЕ?? На дворе 21й век, а порядок ключей до сих пор имеет значение.

★☆☆☆

Последнее исправление: drull (всего исправлений: 1)

умвр, чяднт?

$ gcc `sdl-config --cflags --libs` -o sdl sdl.c && ./sdl
VideoMode settings -Ok
Quiting SDL...
$
beastie ★★★★★
()

Где логика, ГДЕ??

Если ты не видишь логики, у тебя проблемы.

На дворе 21й век, а порядок ключей до сих пор имеет значение.

Что за версия компилятора? У меня в Lenny всё работает.

tailgunner ★★★★★
()

На дворе 21й век, а порядок ключей до сих пор имеет значение.

Без паники. Всё компилируется, всё работает. Порядок ключей никакого значения не имеет. Проверял и первый вариант, и второй — оба компилируют без единого звука.

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

Порядок ключей никакого значения не имеет.

ЕМНИП, таки имеет - когда библиотек несколько, и одна зависит от другой.

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

ЕМНИП, таки имеет - когда библиотек несколько, и одна зависит от другой.

Да, кажется, именно так, но здесь я имел в виду данный конкретный пример. А в общем смысле — часто бывает, когда зависимости определяют порядок, причём не только библиотек в строке компиляции, но и include-ов в исходнике. Вроде бы натыкался на такое когда-то.

DeVliegendeHollander ★★
()

/me вспомнил, как в msvc до версии 2008 года если в неправильном порядке подключить winsock2.h и windows.h то ничего не собиралось.

Kosyak ★★★★
()

Где логика, ГДЕ??

Логика в компиляторе. Можно вырубить через "--allow-missing-functions" (точно не помню). Вообще все так и должно собираться. Сначала компиляется код, а потом линковка. Делай как папка - «gcc -c» + ld ...

gh0stwizard ★★★★★
()

Это документировано, либы идут в конце. Системы сборки об этом тоже знают. Ты несколько опоздал с негодованием, об этом лет 6-7 назад шумели :)

Неприятная фигня, конечно.

true_admin ★★★★★
()
Ответ на: комментарий от Begemoth

Это у них распространённая практика :-)

не только у них, в линухах тоже такого хватает. Если вспомню - назову пару примеров. Впрочем, вот один из подобных косяков: https://lkml.org/lkml/2012/1/17/421

true_admin ★★★★★
()

Вообще все так и должно собираться. Сначала компиляется код, а потом линковка.

Плюсую. Сначала создаешь объектные файлы, потом уже все линкуешь. Так что ничего тут страшного нет, если понимать, как происходит сборка бинарника.

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

Что за версия компилятора? У меня в Lenny всё работает.

Сейчас на работе. Вечером дома посмотрю, отпишусь.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от true_admin

Интересно, а в чем у разработчиков проблема пофиксить такое поведение? Флаги линковки ведь должны применяться только во время линковки, так какая разница в каком месте командной строки они стоят? И вообще, если я указал флаг, что вот эту либу надо подключить, какого фига слишком умный компилятор (или линкер?) этого не делает?

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

Интересно, а в чем у разработчиков проблема пофиксить такое поведение?

думаю потому что worksforme синдром. Я считаю это вторая по важности проблема опенсоурса. Люди не заморачиваются юзабили, от этого все беды.

Это не правда что sendmail не дружелюбен, просто он разборчив в друзьях :).

true_admin ★★★★★
()
Ответ на: комментарий от AntonK

да, порядок линковки _статических_ либ имеет значения

Reset ★★★★★
()
Ответ на: комментарий от tailgunner

Что за версия компилятора? У меня в Lenny всё работает.

Ты наверно линкуешь libSDL.so, а автор топика libSDL.a

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

У меня в Lenny всё работает.

Ты наверно линкуешь libSDL.so,

Я линкую ровно той же командой, что и ТС; да и линковщих всё равно резольвит символы.

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

Я линкую ровно той же командой

это еще ничего не значит

Reset ★★★★★
()
Ответ на: комментарий от Bad_ptr

сейчас, кстати, SDL2 есть

SDL 2.0 (WARNING: UNDER CONSTRUCTION): ...

drull ★☆☆☆
() автор топика
Ответ на: комментарий от AntonK

Да, те же яйца.

drull@drull-AOA150:~$ gcc -lSDL -o sdl 1.cpp
/tmp/cchLW4mG.o: In function `main':
1.cpp:(.text+0x16): undefined reference to `SDL_Init'
1.cpp:(.text+0x3a): undefined reference to `SDL_SetVideoMode'
1.cpp:(.text+0x76): undefined reference to `SDL_RWFromFile'
1.cpp:(.text+0x86): undefined reference to `SDL_LoadBMP_RW'
1.cpp:(.text+0xc7): undefined reference to `SDL_UpperBlit'
1.cpp:(.text+0xdb): undefined reference to `SDL_WM_SetCaption'
1.cpp:(.text+0xe8): undefined reference to `SDL_FreeSurface'
1.cpp:(.text+0xf5): undefined reference to `SDL_Flip'
1.cpp:(.text+0x11d): undefined reference to `SDL_PollEvent'
1.cpp:(.text+0x14b): undefined reference to `SDL_FreeSurface'
1.cpp:(.text+0x150): undefined reference to `SDL_Quit'
collect2: ld returned 1 exit status

drull ★☆☆☆
() автор топика
Ответ на: комментарий от tailgunner

Что за версия компилятора? У меня в Lenny всё работает.

drull@drull-AOA150:~$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
drull ★☆☆☆
() автор топика
Ответ на: комментарий от DeVliegendeHollander

На дворе 21й век, а порядок ключей до сих пор имеет значение.

Без паники. Всё компилируется, всё работает.

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

drull ★☆☆☆
() автор топика

Это сделано намеренно, именно для XXI века.

g++ -Wl,--no-as-needed -lSDL -o sdl 1.cpp
AptGet ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.