10

我开始使用 SDL 和 C 编程。我有其他编程语言的经验,但是在 C 中链接/编译库对我来说是新的。我使用的是 Mac 10.8,并按照自述文件 ( ./configure; make; make install) 中的说明安装了最新的稳定版 2.0。这是我要编译的示例代码:

#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)

我尝试搜索 wiki、教程以及我能找到的任何类型的文档,但我在任何地方都找不到任何示例来说明如何正确编译使用 SDL 的 C 程序。

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

4

3 回答 3

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

在哪里:

  • -ISDL.h用,将编译器指向目录
  • -LlibSDL.a用(或libSDL.so)将链接器指向目录,
  • -l指示链接器与库链接,在我们的例子中libSDL.alibSDL.so. 请注意,缺少lib前缀和.a/.so后缀。

请注意,即使在 Linux 机器上,我也没有检查此说明(另一方面,我无法访问 Mac OS 机器)。

还有一件事:默认情况下,带有已编译和链接示例的二进制文件将被调用a.out。要更改这一点,您可以-o提供gcc.

于 2013-10-14T19:50:03.763 回答
12

我发现您可以使用一个名为的工具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)
于 2013-10-14T19:24:11.790 回答
0

tl;博士

sudo apt install libsdl1.2-dev

您缺少 SDL 库文件。只需安装它们,一切都应该开箱即用。

不同的版本和扩展

SDL 有多个版本,请确保安装应用程序所需的版本。如果您使用它们的功能,还需要安装 SDL 的其他库(称为项目) 。例如,如果您使用 TTF 字体或图像相关功能。输入后只需按两次 TABsudo apt install libsdl即可查看所有可用的包。

于 2020-11-08T05:27:11.950 回答