我正在构建一个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:
答案 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导致控制台通信失败。