跨平台静态链接SDL2

时间:2015-08-05 15:58:38

标签: static-linking sdl-2

我正在构建一个SDL2 / C ++程序,该程序需要可移植到可能没有安装SDL的Windows,Mac和Linux机器上。

我已经读过静态链接是解决方案,但我不太善于编译,也不知道如何静态链接。

我的程序仅依赖于SDL2,GLU和OpenGL。我正在使用MinGW(在Windows 8.1上)或gcc(在Ubuntu 14.04上)编译C ++ - 这两个操作系统都安装了原生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 $@ $(CFLG) $<
.cpp.o:
    g++ -std=c++11 -c -o $@ $(CFLG) $<

#  Link
$(EXE):$(EXE).o
    g++ -std=c++11 -O3 -o $@ $^   $(LIBS)

#  Clean
clean:
    $(CLEAN)

# Force
FORCE:

2 个答案:

答案 0 :(得分:1)

要与静态库链接,您可以指定库文件的路径

gcc -o out_bin your_object_files.o path/to/lib.a -lfoo

或要求链接器使用带有-Bstatic链接器标志的静态版本。通常,您需要将其他库的链接重置为动态,例如对于静态SDL2和GLU,但动态GL:

gcc -o out_bin your_object_files -Wl,-Bstatic -lSDL2 -lGLU -Wl,-Bdynamic -lGL

这当然意味着库的静态版本存在于库搜索路径列表中(.a libs,用于所有指定平台上的gcc,尽管MSVC对静态库使用.lib

然而,你通常根本不想这样做。软件的通常做法是依赖某些库(在Linux上广泛使用,包含包和dependendices列表)或带来所需的库。您可以使用您的程序分发SDL动态库,并使用LD_LIBRARY_PATH或相对路径加载它。

另请注意,较新的SDL2实现了动态加载功能,这提供了一种使用用户指定的动态库覆盖SDL的方法,即使是静态链接也是如此。

答案 1 :(得分:1)

它与静态链接没有直接关系。当静态链接时,我必须包含所有SDL的依赖库。事实证明,让-mwindows导致控制台通信失败。