2013-03-22 4 views
1

Я настраиваю Simple Direct Media Layer Library для своей 64-разрядной системы Windows 7. Базовая библиотека отлично работает как с MinGW, так и с Free Pascal, но в настоящее время я хочу включить библиотеку SDL_gfx. В онлайн-учебнике, который я нашел, говорит, что мне нужно создать собственную DLL для системы Windows. Link to the Tutorial. Chapter 4a is about GFXSDL_gfx 2.0.24 DLL не создается, используя MinGW

Я выполнил шаги и соответствующим образом изменил файл makefile. Но когда я запускаю «mingw32-make» в папке gfx, он прерывается с сообщением об ошибке «неопределенная ссылка на« GFX_ALPHA_ADJUST_ARRAY »». Впоследствии это сообщение повторяется снова, но указывает на другую часть исходного кода. Затем «ld.exe» прерывается с сообщением «bad reloc address 0x0 в разделе« .data ». «collect2.exe» также терпит неудачу, потому что «ld» возвратил 1 как конечный статус. Затем make-файл жалуется, что «рецепт для цели« SDL_gfx.dll »не удался».

У меня есть ноутбук для Linux, поэтому я подумал, что это может помочь скомпилировать все, но я не знаю, насколько это сложно. Поэтому в основном я прошу совета, что делать. Что касается отладки, я несколько раз заново установил всю библиотеку SDL и протестировал ее, если она работает правильно. Другая DLL, которую я установил (SDL_image.dll), отлично работает.

Я уже смотрел в Интернете для предварительно скомпилированных библиотек DLL, но они либо устарели, либо для 32-битных систем. Но если ничего не работает, это тоже может быть решением. Я отправлю файл makefile и части исходного кода, где также отсутствует переменная.

Makefile

CC = gcc 
    AR=ar rc 
    RANLIB=ranlib 

    prefix=C:/ 
    bin_dir=$(prefix)/bin 
    include_dir=$(prefix)/include 
    lib_dir=$(prefix)/lib 

    CFLAGS = -O3 -march=athlon-xp -mmmx -msse -m3dnow -DBUILD_DLL -IC:/MinGW/include/SDL 
    LIBS = -LC:/MinGW/lib -lSDL 

    OBJS = SDL_framerate.o SDL_gfxPrimitives.o SDL_imageFilter.o SDL_rotozoom.o 

    STATIC_LIB=libSDL_gfx.a 
    IMPORT_LIB=libSDL_gfx.dll.a 
    SHARED_LIB=SDL_gfx.dll 

    all: $(STATIC_LIB) $(SHARED_LIB) 

    $(STATIC_LIB): $(OBJS) 
    $(AR) [email protected] $^ 
    $(RANLIB) [email protected] 

    $(SHARED_LIB): $(OBJS) 
gcc -s -shared -o [email protected] $^ -Wl,--enable-auto-import,--export-all -Wl,--out-implib=$(IMPORT_LIB) $(LIBS) 

    test: $(SHARED_LIB) $(STATIC_LIB) Test/TestFramerate.exe Test/TestFonts.exe 
    Test/TestGfxPrimitives.exe Test/TestImageFilter.exe Test/TestRotozoom.exe 

    Test/TestFramerate.exe: Test/TestFramerate.c 
gcc -c $^ -o Test/TestFramerate.o -O3 -march=athlon-xp -mmmx -msse -m3dnow -DWIN32 -Ic:/dev/local/include/SDL 
gcc -o [email protected] Test/TestFramerate.o $(CFLAGS) -L../ -Lc:/dev/local/lib -lmingw32 -lSDLmain $(SHARED_LIB) -lSDL 

    Test/TestFonts.exe: Test/TestFonts.c 
gcc -c $^ -o Test/TestFonts.o -O3 -march=athlon-xp -mmmx -msse -m3dnow -DWIN32 -Ic:/dev/local/include/SDL 
gcc -o [email protected] Test/TestFonts.o $(CFLAGS) -L../ -Lc:/dev/local/lib -lmingw32 -lSDLmain $(SHARED_LIB) -lSDL 

    Test/TestGfxPrimitives.exe: Test/TestGfxPrimitives.c 
gcc -c $^ -o Test/TestGfxPrimitives.o -O3 -march=athlon-xp -mmmx -msse -m3dnow -DWIN32 -Ic:/dev/local/include/SDL 
gcc -o [email protected] Test/TestGfxPrimitives.o $(CFLAGS) -L../ -Lc:/dev/local/lib -lmingw32 -lSDLmain $(SHARED_LIB) -lSDL 

    Test/TestImageFilter.exe: Test/TestImageFilter.c 
gcc -c $^ -o Test/TestImageFilter.o -O3 -march=athlon-xp -mmmx -msse -m3dnow -DWIN32 -Ic:/dev/local/include/SDL 
gcc -o [email protected] Test/TestImageFilter.o $(CFLAGS) -L../ -Lc:/dev/local/lib -lmingw32 -lSDLmain $(SHARED_LIB) -lSDL 

    Test/TestRotozoom.exe: Test/TestRotozoom.c 
gcc -c $^ -o Test/TestRotozoom.o -O3 -march=athlon-xp -mmmx -msse -m3dnow -DWIN32 -Ic:/dev/local/include/SDL 
gcc -o [email protected] Test/TestRotozoom.o $(CFLAGS) -L../ -Lc:/dev/local/lib -lmingw32 -lSDLmain $(SHARED_LIB) -lSDL 

    install: $(STATIC_LIB) $(SHARED_LIB) 
cp $(STATIC_LIB) $(SHARED_LIB) $(IMPORT_LIB) $(lib_dir) 
cp SDL_framerate.h SDL_gfxPrimitives.h SDL_imageFilter.h SDL_rotozoom.h $(include_dir)/SDL 

    uninstall: 
rm -f $(lib_dir)/$(STATIC_LIB) 
rm -f $(lib_dir)/$(SHARED_LIB) 
rm -f $(lib_dir)/$(IMPORT_LIB) 
rm -f $(include_dir)/SDL/SDL_framerate.h 
rm -f $(include_dir)/SDL/SDL_gfxPrimitives.h 
rm -f $(include_dir)/SDL/SDL_imageFilter.h 
rm -f $(include_dir)/SDL/SDL_rotozoom.h 

    clean: 
rm -f *.o *.a *.dll 
rm -f Test/*.o Test/*.exe 

Детали из 'SDL_gfxPrimitives.c'; линия 435-445 и 773-785

/*435-445*/ 
    #ifdef ALPHA_PIXEL_ADDITIVE_BLEND 
        A = (dA | GFX_ALPHA_ADJUST_ARRAY[alpha & 255]) << Ashift; // make destination less transparent... 
    #else 
        A = ((dA + ((((color & Amask) >> Ashift) - dA) * alpha >> 8)) << Ashift) & Amask; 
    #endif 
        *pixel |= A; 
       } 
      } 
     } 
     break; 
    #endif 

    /*773-785*/ 
    #ifdef ALPHA_PIXEL_ADDITIVE_BLEND 
         A = (dA | GFX_ALPHA_ADJUST_ARRAY[sA & 255]) << Ashift; // make destination less transparent... 
    #else 
         A = ((dA + ((sA - dA) * alpha >> 8)) << Ashift) & Amask; 
    #endif 
         *pixel |= A; 
        } 
       } 
      } 
     } 
    } 
    break; 
    #endif 

ответ

2

Вы должны изменить Makefile в соответствии со следующими этапами:

1. Изменение:

OBJS = SDL_framerate.o SDL_gfxPrimitives.o SDL_imageFilter.o SDL_rotozoom.o 

To: 

OBJS = SDL_framerate.o SDL_gfxBlitFunc.o SDL_gfxPrimitives.o SDL_imageFilter.o SDL_rotozoom.o 

2. Изменение:

cp SDL_framerate.h SDL_gfxPrimitives.h SDL_imageFilter.h SDL_rotozoom.h $(include_dir)/SDL 

Кому:

cp SDL_framerate.h SDL_gfxBlitFunc.h SDL_gfxPrimitives.h SDL_imageFilter.h SDL_rotozoom.h $(include_dir)/SDL 

3. Добавить: rm -f $(include_dir)/SDL/SDL_gfxBlitFunc.h

Между

rm -f $(include_dir)/SDL/SDL_framerate.h 

И

rm -f $(include_dir)/SDL/SDL_gfxPrimitives.h 
+0

Спасибо большое, я, наконец, получил DLL. Не могли бы вы объяснить, что означают эти изменения и почему они должны быть сделаны? Я вижу, что вы добавили 'gfxBlitFunc' в несколько строк, но зачем они нужны? – Petroglyph

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