我开始使用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程序的示例。
编译此程序需要做什么?
答案 0 :(得分:9)
我发现你可以使用一个名为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)
答案 1 :(得分:9)
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.a
(或libSDL.so
)目录,-l
指示链接器与库链接,在我们的案例中为libSDL.a
或libSDL.so
。请注意,缺少lib
前缀和.a
/ .so
后缀。请注意,我没有检查此说明,即使在Linux机器上(另一方面我无法访问Mac OS机器)。
还有一件事:默认情况下,带编译和链接示例的二进制文件将被称为a.out
。要更改此设置,您可以向-o
提供gcc
选项。
答案 2 :(得分:0)
sudo apt install libsdl1.2-dev
您缺少SDL库文件。只需安装它们,一切都应立即可用。
SDL有多个版本,请确保安装了应用程序所需的版本。如果使用SDL,还需要安装additional libraries (called projects)。例如,如果您使用TTF字体或与图像相关的功能。键入sudo apt install libsdl
后,只需按两次TAB键即可查看所有可用的软件包。