D и SDL - недефинирани функции

Имам тази много проста D програма (pk.d):

import std.stdio;
import SDL;

int main(string[] args) {
    writefln("Hello world");
    if (SDL_Init( SDL_INIT_VIDEO ) < 0) {
        writefln("Unable to init SDL");
        return 1;
    }

    return 0;
}

Имам много ясен скрипт за създаване (тук съм на Windows, но компилаторът на Windows D идва в пакет с bash интерпретатор):

DMD=dmd
DFLAGS=-I./lib/SDL 

$(DMD) pk $(DFLAGS)
pk

Но когато го създам, получавам Error 42: Symbol Undefined _SDL_Init

Той успя да импортира SDL добре и намира SDL_INIT_VIDEO добре. Продължих и проверих в SDL.d и открих, че има дефиниция за SDL_Init: int SDL_Init(Uint32 flags);. Не мога да разбера това. Това е първата не-STL библиотека, която импортирах с D, така че се надявам грешката ми да е очевидна, може ли някой да я види?


person Ponkadoodle    schedule 25.02.2011    source източник


Отговори (3)


Трябва също да се свържете с библиотеката SDL. Ако имате такъв в правилния формат, просто го предайте на компилатора заедно с вашите изходни файлове. Като алтернатива можете да добавите нещо като pragma(lib, "SDL.lib") към вашата програма.

person Vladimir Panteleev    schedule 25.02.2011
comment
FWIW: Символ Недефинираните и модифицирани имена (обърнете внимание на добавеното водещо '_') обикновено са индикация за грешки във фазата на свързване и през повечето време това се равнява на забравяне да се добави нещо за свързване. - person BCS; 01.03.2011

Преди всичко се нуждаете и от D обвързвания за SDL библиотека.

import std.stdio;
import sdl;

int main(string[] args)
{
    SDL_Surface * screen;

    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(800, 600, 24, SDL_SWSURFACE);

    SDL_FillRect(screen, &screen.clip_rect, SDL_MapRGB(screen.format, 
                                                       0xFF, 0x00, 0x00));
    SDL_Flip(screen);

    SDL_Delay(6000);
    return 0;
}

Това е моята примерна тестова програма. Първо изтеглих SDL библиотеки за разработка за VC6

След това трябва да конвертирате библиотечните файлове във формат OMF. Предпочитам coff2omf инструмента, който се доставя с Borland C++ Compiler, защото е безплатен . DigitalMars има инструмент със същото име, но не е безплатен. Което за мен няма смисъл.

coff2omf.exe SDL.lib SDL2.lib

И след това компилирах и свързах така:

dmd -c test.d sdl.d

връзка test.obj sdl.obj SDL2.lib

При мен работи.

person Erdem    schedule 20.05.2011

Освен това, ако имате нужда от D обвързване за библиотека SDL, можете да изтеглите от тук. Името на файла е sdl.d, но все още не е завършен.

person Erdem    schedule 20.05.2011