如何编译一个用C语言编写的SDL示例程序?

10

我正在学习SDL和C语言编程。我有其他编程语言的经验,但在C语言中链接/编译库是新的挑战。我正在使用Mac 10.8,并按照read me中的说明安装了最新稳定版2.0(./configure; make; make install)。这里是我正在尝试编译的示例代码:

#include <stdlib.h>
#include <stdio.h>
#include "SDL.h"

int main(void)
{
  if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0) {
    fprintf(stderr, "\nUnable to initialize SDL:  %s\n", SDL_GetError());
    return 1;
  }
  atexit(SDL_Quit);

  return 0;
}

当我尝试使用gcc example.c编译我的脚本时,我会遇到一个错误:

example.c:3:17: error: SDL.h: No such file or directory
example.c: In function ‘main’:
example.c:7: error: ‘SDL_INIT_VIDEO’ undeclared (first use in this function)
example.c:7: error: (Each undeclared identifier is reported only once
example.c:7: error: for each function it appears in.)
example.c:7: error: ‘SDL_INIT_TIMER’ undeclared (first use in this function)
example.c:8: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’
example.c:8: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’
example.c:11: error: ‘SDL_Quit’ undeclared (first use in this function)

我尝试搜索维基、教程和任何可找到的文档,但我无法找到任何示例来展示如何正确编译一个使用SDL的C程序。

我需要做什么来编译这个程序?

3个回答

14

我发现你可以使用一个叫做pkg-config的工具来查找特定库所需的编译器标志。

$ pkg-config --cflags --libs sdl2
-D_THREAD_SAFE -I/usr/local/include/SDL2 -I/usr/X11R6/include -L/usr/local/lib -lSDL2

$ gcc example.c $(pkg-config --cflags --libs sdl2)

如果您正在使用Makefile,则需要在命令前加上shell前缀:

all:
    gcc example.c $(shell pkg-config --cflags --libs sdl2)

这是一个很好的小技巧 :) - bx2

13
对于C语言初学者的一般提示:自上而下地阅读错误日志,通常修复第一个错误即可解决其他所有错误。在您的情况下,第一个错误是:
example.c:3:17: error: SDL.h: No such file or directory

正如其他人所说,您需要指示gcc在哪里找到SDL.h。您可以通过提供-I选项来完成此操作。

要检查SDL.h的默认安装位置,我会发出以下命令:

./configure --help

在你编译 libsdl 的目录下寻找 --prefix,在 Linux 中默认的前缀通常是 /usr/local。为了编译你的示例代码,在 Linux 上我会执行以下命令:
gcc example.c -I/usr/local/include

但上述命令会编译并且链接代码。在成功编译后,gcc还会抛出另一堆错误,其中之一是undefined reference

为了防止这种情况,在Linux上完整的构建示例命令行应该是:

gcc example.c -I/usr/local/include -L/usr/local/lib -lSDL

说明:

  • -I 指定编译器搜索头文件 SDL.h 的目录,
  • -L 指定链接器搜索库文件 libSDL.alibSDL.so 的目录,
  • -l 告诉链接器链接指定的库,在本例中为 libSDL.alibSDL.so。请注意,前缀 lib 和后缀 .a/.so 被省略了。

请注意,作者没有检查这个指令,甚至在 Linux 机器上也没有测试过(另一方面,作者没有 Mac OS 机器的访问权限)。

还有一件事:编译和链接示例代码生成的可执行文件默认名为 a.out。要更改名称,可以向 gcc 提供 -o 选项。


0

简而言之

sudo apt install libsdl1.2-dev

您缺少SDL库文件。只需安装它们,一切都应该可以直接使用。

不同版本和扩展

有多个版本的SDL,请确保安装所需的版本。如果您使用其功能,则还需要安装其他名为项目的 SDL库。例如,如果您使用TTF字体或图像相关功能,则只需在键入sudo apt install libsdl后按两次TAB键即可查看所有可用软件包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接