Я создаю программу SDL2/C++, которая должна быть переносимой на компьютеры Windows, Mac и Linux, у которых может не быть установлен SDL.Межплатформенное статическое связывание SDL2
Я читал, что статическое связывание - это решение, но я не очень хорошо разбираюсь и не знаю, как статическую ссылку.
Моя программа полагается только на SDL2, GLU и OpenGL. Я компилирую C++ с помощью MinGW (в Windows 8.1) или gcc (на Ubuntu 14.04) - обе эти ОС имеют встроенный SDL.
Вот мой текущий Makefile, полученный из образца Makefile вверенного мне профессор шахты:
# Executable/file name
EXE=experiment
# MinGW
ifeq "$(OS)" "Windows_NT"
CFLG=-O3 -Wall -DUSEGLEW
LIBS= -lSDL2 -lglu32 -lopengl32
CLEAN=del *.exe *.o *.a
else
# OSX
ifeq "$(shell uname)" "Darwin"
CFLG=-O3 -Wall -Wno-deprecated-declarations
LIBS=-framework SDL2 -framework OpenGL
# Linux\Unix\Solaris
else
CFLG=-O3 -Wall
LIBS= `sdl2-config --cflags --libs` -lGLU -lGL -lm
endif
# OSX\Linux\Unix\Solaris
CLEAN=rm -f $(EXE) *.o *.a
endif
# Dependencies
$(EXE).o: $(EXE).cpp FORCE
.c.o:
gcc -c -o [email protected] $(CFLG) $<
.cpp.o:
g++ -std=c++11 -c -o [email protected] $(CFLG) $<
# Link
$(EXE):$(EXE).o
g++ -std=c++11 -O3 -o [email protected] $^ $(LIBS)
# Clean
clean:
$(CLEAN)
# Force
FORCE:
Спасибо! Но похоже, что -Bstatic не имеет желаемого эффекта (он все еще ищет SDL2.dll во время выполнения). Удаление «B» и запятых, кажется, исправить это, но затем оно дает множество неопределенных ссылок. Я видел другое решение, которое при связывании статически нужно связать вручную со всем, что ссылается на SDL (-lmingw32 -lSDL2main -lSDL2 -mwindows -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -static-libgcc). Это компиляция без ошибок, но программа не работает. – user258887
Он просто работает тихо в фоновом режиме, не открывая окна. Нужно ли динамически связывать некоторые из этих новых библиотек? Я связываю их все статически, за исключением -lopengl32 и -lm. – user258887
Я понял, что программа зависает при попытке использовать printf() и getline() для stdio вместо фактической печати или получения. Это происходит только при статической привязке. Есть ли что-то особенное в отношении статической связи с stdio? – user258887