我目前正在做一些C编程,实际上我想使用SDL库。我想在Linux上用C语言构建一个小型2D游戏,以提高我的技能。
我的问题是我不是Linux超级用户的超级 Makefile 用户或库,我只是在项目上配置一次就是这样。
所以我在UBUNTU 14.04上编译SDL2程序时遇到了一些麻烦。
我从http://www.libsdl.org/download-2.0.php
下载了最新的SDL库然后我使用默认步骤安装它:
./configure
make
sudo make install
之后我可以看到 / usr / include / SDL2 中有一些东西,所以我猜它已经安装了。
#include <stdlib.h>
#include <stdio.h>
#include <SDL2/SDL.h>
int main(int argc, char *argv[])
{
printf(“SDL test\n”);
return 0;
}
因为我还在学习Makefile和SDL,所以我没想到它。
但我发现这个Makefile可以编译旧的SDL而不是SDL2
CPP=gcc
CFLAGS=-O3
LDFLAGS=-lSDL -lSDL_mixer #Linker
EXEC=test
all: ${EXEC}
${EXEC}: ${EXEC}.o
${CPP} $(CFLAGS) -o ${EXEC} ${EXEC}.o ${LDFLAGS}
${EXEC}.o: ${EXEC}.c
${CPP} $(CFLAGS) -o ${EXEC}.o -c ${EXEC}.c
clean:
rm -fr *.o
mrproper: clean
rm -fr ${EXEC}
但是这个Makefile对我不起作用,它说它不知道lSDL_Mixer和其他东西。
如何使用Makefiles和vim编辑器构建可运行的Makefile以使用SDL2编译C程序。
提前感谢您的帮助
答案 0 :(得分:6)
我会继续为你清理那个Makefile。
CFLAGS = -O3
LDFLAGS =
appname = test
all: $(appname)
clean:
rm -f $(appname) *.o
.PHONY: all clean
sdl_cflags := $(shell pkg-config --cflags sdl2 SDL2_mixer)
sdl_libs := $(shell pkg-config --libs sdl2 SDL2_mixer)
override CFLAGS += $(sdl_cflags)
override LIBS += $(sdl_libs)
$(appname): test.o
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
makefile中的变量应与$(...)
一起使用,而不是${...}
。
pkg-config
有一个SDL_Mixer条目,sdl-config
没有。 pkg-config
更为通用。
使用带有SDL标记的override
,可以在不破坏SDL支持的情况下运行make CFLAGS="-O0 -g"
之类的内容。
这实际上很重要:由于GNU链接器对库的顺序很敏感,因此SDL库标志必须位于LIBS
的命令行末尾。指定。
您不需要.c
文件的明确规则,因为GNU Make具有完全正确的隐式规则。
请注意,此makefile中缺少一些非常重要的功能。例如,当您更改头文件时,它不会自动重新编译。我建议您使用另一个构建系统,例如CMake或SCons,它会自动处理此问题。你也可以用Make来做,但是你必须将几行神秘的代码粘贴到你的makefile中。
答案 1 :(得分:4)
您可以使用SDL Linux FAQ建议的sdl2-config
来获取所需的编译器和链接器标志:
SDL_CFLAGS := $(shell sdl2-config --cflags)
SDL_LDFLAGS := $(shell sdl2-config --libs)
CFLAGS := $(SDL_CFLAGS) -O3
LDFLAGS := $(SDL_LDFLAGS) -lSDL_mixer
它会找到您SDL.h
的位置,并在其认为必要的其他标记中返回相应的标记(例如您的情况下为-I/usr/include/SDL2
)(例如,对我而言,它会给出-D_THREAD_SAFE
)。然后你可以简单地#include <SDL.h>
,这是包含SDL的标准方法。