c - 如何在 Linux/Ubuntu 上安装/编译 SDL2 C 代码

标签 c linux sdl

我目前正在做一些 C 编程,实际上我想使用 SDL 库。我想在 Linux 上用 C 语言构建一个小型 2D 游戏来提高我的技能。

我的问题是我不是 super Makefile 用户,也不是 Linux 库 super 用户,我只是在项目上配置一次,仅此而已。

所以我在 UBUNTU 14.04 上编译 SDL2 程序时遇到了一些问题。

我从以下位置下载了最新的 SDL 库:http://www.libsdl.org/download-2.0.php

然后我就按照默认步骤安装了:

./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;
}

因为我还在学习 Makefiles 和 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 和其他东西。

如何使用 Makefile 和 vim 编辑器构建一个可用的 Makefile 以使用 SDL2 编译 C 程序。

预先感谢您的帮助

最佳答案

我会继续为您清理 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" 的东西。

  • 这实际上很重要:SDL 库标志必须位于命令行的末尾,在 LIBS 中,因为 GNU 链接器对命令的顺序很敏感指定了哪些库。

  • .c 文件不需要显式规则,因为 GNU Make 有隐式规则,这很好。

请注意,此 makefile 中缺少一些非常重要的功能。例如,当您更改头文件时,它不会自动重新编译。我建议您使用其他构建系统,例如 CMake 或 SCons,它们会自动处理此问题。您也可以使用 Make 完成此操作,但您必须将几行神秘的代码粘贴到您的 makefile 中。

关于c - 如何在 Linux/Ubuntu 上安装/编译 SDL2 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29876411/

相关文章:

python包没有安装在使用ubuntu的虚拟环境中

c++ - 使用 SDL 平滑缩放大图像

c++ - 一种使键盘事件队列既响应又不占用整个 CPU 能力的方法

c++ - 为什么我的程序使用的内存在运行时不断增长?

c - 为什么 gdb 将 sqrt(3) 评估为 0?

c - 托管 Flash 不会加载 swf 资源(xml、图像等)

c - 我怎样才能让这个程序更快?

将lua共享对象编译为嵌入式c

c - 如何在Linux中使用RAW套接字发送802.11管理帧和数据帧

linux - 在内核构建中使用交叉编译工具