2016-05-29 5 views
0

Я пытаюсь перекрестно скомпилировать часть программного обеспечения, которое я делаю. Я нахожусь в Linux, и у меня довольно тяжелое время пытаюсь написать Makefile для компиляции библиотеки DLL с использованием SDL2. Вот он:Как скомпилировать dll, которому нужны другие dlls

#the compiler 
CC = i686-w64-mingw32-gcc 

#the standart ompilation flags of the project 
CFLAGS = -O3 -Wall -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration 

#path to the folder's root, where the holy not build framework is. Relate to this Makefile 
PREPATH = .. 

#Path to the SDL, SDL_image and Lua includes and libs 
SDL2INCLUDES = -I $(PREPATH)/SDL2/include 
SDL2LIBS = $(PREPATH)/BINARIES/4windows/SDL2/64/SDL2.dll 
SDLIMAGE2INCLUDES = -I $(PREPATH)/SDL2/SDL_image 
SDLIMAGE2LIBS = $(PREPATH)/BINARIES/4windows/SDL2_image/64/SDL2_image.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libjpeg-9.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libpng16-16.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libtiff-5.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libwebp-4.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/zlib1.dll 
#LUAINCLUDES = -I $(PREPATH)/lua/ 
#LUALIB = $(PREPATH)/lua/ -llua -lm 

#Where to put the compiled program 
COMPILEPATH = $(PREPATH)/BINARIES/ 



#Build options 

build: NLF.o 
    cp ./*.o $(COMPILEPATH) 
    $(CC) $(CFLAGS) -shared -o $(COMPILEPATH)libNLF.dll $(SDL2LIBS) $(SDLIMAGE2LIBS) $(COMPILEPATH)*.o 

NLF.o: NLF_osservice.o NLF_error.o NLF_screen.o NLF.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF.c 
NLF.h.gch: NLF.h 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF.h 

NLF_osservice.o: NLF_osservice.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) NLF_osservice.c 
NLF_osservice.h.gch: 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) NLF_osservice.h 

NLF_error.o: NLF_error.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) NLF_error.c 
NLF_error.h.gch: 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) NLF_error.h 

NLF_screen.o: NLF_screen.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF_screen.c 
NLF_screen.h.gch: 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF_screen.h 



#cleaning options 

clean-build: 
    rm -f -v $(COMPILEPATH)*.o 

clean-all: 
    rm -f -v ./*.o ./*.h.gch 
    rm -f -v $(COMPILEPATH)*.o $(COMPILEPATH)*.so 

clean-soft: 
    rm -f -v ./*.o ./*.h.gch 
    rm -f -v $(COMPILEPATH)*.o 

При запуске сделать все, компиляция прекрасно работает, но когда дело доходит до -shared части, я получаю это:

../BINARIES/4windows/SDL2/64/SDL2.dll: file not recognized:

Я пытался добавить -L перед третьей стороной DLL, например:

SDL2LIBS = -L $(PREPATH)/BINARIES/4windows/SDL2/64/SDL2.dll 
SDLIMAGE2LIBS = -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/SDL2_image.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libjpeg-9.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libpng16-16.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libtiff-5.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libwebp-4.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/zlib1.dll 

И тогда я получаю неопределенную ссылку ошибки ... Тех же ошибки, если я изменить строку:

$(CC) $(CFLAGS) -shared -o $(COMPILEPATH)libNLF.dll $(SDL2LIBS) $(SDLIMAGE2LIBS) $(COMPILEPATH)*.o 

для

$(CC) $(CFLAGS) $(SDL2LIBS) $(SDLIMAGE2LIBS) -shared -o $(COMPILEPATH)libNLF.dll $(COMPILEPATH)*.o 

Кто-нибудь знает, что происходит?

ответ

1

Вам не следует использовать -L перед библиотечными файлами. -L указывает путь к библиотеке. Для файлов библиотеки вы должны использовать -l (нижний регистр L). Но если вы указываете путь к файлу и включаете расширение файла, вам не нужно использовать -l. Поэтому первоначальный Makefile был правильным в этом смысле.

Вы должны указать полную ошибку, что у вас есть, а не just file not recognized:. Уверен, что это ошибка file format not recognized, которая, вероятно, указывает на то, что вы не должны связываться с файлом .dll, но .lib-файлами. Similar problem here.

+0

Да, это ошибка «формат файла не распознана»: ../BINARIES/4windows/SDL2/64/SDL2.dll: файл не распознан: Formato de arquivo não reconhecido –

+0

Я думаю, что я понял ошибку, двоичные файлы .dll файл должен быть доставлен с окончательным приложением. Для компилятора я должен связать файлы .a и .dll.a ... Мне просто интересно, что для linux я использую файлы .a и .so. Но для окон только .a? ... Я все равно попробую. –

+0

Вот что пытались: i686-w64-mingw32-gcc -O3 -Wall -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration -shared -o ../BINARIES /libNLF.dll ../BINARIES/4windows/SDL2/64/libSDL2.a ../BINARIES/4windows/SDL2/64/libSDL2.dll.a ../BINARIES/4windows/SDL2/64/libSDL2main.a .. /BINARIES/4windows/SDL2/64/libSDL2_test.a ../BINARIES/4windows/SDL2_image/64/libSDL2_image.a ../BINARIES/4windows/SDL2_image/64/libSDL2_image.dll.a || Я получил кучу неопределенных опорных ошибок для функций SDL. –

0

Я решил! вот как Подставив эти файлы в SDL пути:

libSDL2.a, libSDL2.dll.a, libSDL2main.a, libSDL2_test.a, SDL2.lib, SDL2main.lib, and SDL2test.lib

И это с SDL_image одной .:

libSDL2_image.a and libSDL2_image.dll.a

А вот Makefile:

#the compiler 
CC = i686-w64-mingw32-gcc 

#the standart ompilation flags of the project 
CFLAGS = -O3 -Wall -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration 

#path to the folder's root, where the holy not build framework is. Relate to this Makefile 
PREPATH = .. 

#Path to the SDL, SDL_image and Lua includes and libs 
SDL2INCLUDES = -I $DS(PREPATH)/SDL2/include 
SDL2LIBS = -L$(PREPATH)/SDL2/4windows/SDL2/64 -lmingw32 -lSDL2main -lSDL2 
SDLIMAGE2INCLUDES = -I $(PREPATH)/SDL2/SDL_image 
SDLIMAGE2LIBS = -L$(PREPATH)/SDL2/4windows/SDL2_image/64 -lSDL2_image 
#LUAINCLUDES = -I $(PREPATH)/lua/ 
#LUALIB = -L $(PREPATH)/lua/ -llua -lm 

#Where to put the compiled program 
COMPILEPATH = $(PREPATH)/BINARIES/ 



#Build options 

build: NLF.o 
    cp ./*.o $(COMPILEPATH) 
    $(CC) $(CFLAGS) -shared $(COMPILEPATH)*.o $(SDL2LIBS) $(SDLIMAGE2LIBS) -o $(COMPILEPATH)libNLF.dll 

NLF.o: NLF_osservice.o NLF_error.o NLF_screen.o NLF.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF.c 
NLF.h.gch: NLF.h 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF.h 

NLF_osservice.o: NLF_osservice.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) NLF_osservice.c 
NLF_osservice.h.gch: 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) NLF_osservice.h 

NLF_error.o: NLF_error.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) NLF_error.c 
NLF_error.h.gch: 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) NLF_error.h 

NLF_screen.o: NLF_screen.h.gch 
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF_screen.c 
NLF_screen.h.gch: 
    $(CC) $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF_screen.h 



#cleaning options 

clean-build: 
    rm -f -v $(COMPILEPATH)*.o 

clean-all: 
    rm -f -v ./*.o ./*.h.gch 
    rm -f -v $(COMPILEPATH)*.o $(COMPILEPATH)*.dll 

clean-soft: 
    rm -f -v ./*.o ./*.h.gch 
    rm -f -v $(COMPILEPATH)*.o 

Теперь мой новый проблема заключается в том, как скомпилировать все эти вещи в 32-битные окна. Но это утверждение для другого вопроса.

+0

Я заметил, что компилятор i686-w64-mingw32-gcc компилируется на платформу 32 бит! Для компиляции для 64 бит используйте: x86_64-w64-mingw32-gcc-компилятор. Оба приходят, если вы устанавливаете: apt-get install mingw-w64 Конечно, вам понадобится 32 и 64 библиотеки в каждом случае. –

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