3

我是 GNU/Linux (Lubuntu 11.10) 的新手,正在尝试从 2001 年的 Linux 编程书中编译一些 C 源代码。我对在 GNU/Linux 中包含头文件感到有些困惑。

该程序是John R. Hall 等人 (2001)的Programming Linux Games一书中的“simplefb.c” 。我直接跳到了使用帧缓冲区进行控制台编程的章节,但立即遇到了这个问题。只是想在 Linux 上用 C 语言制作一些简单的非 GUI(和非“文本”)游戏,以获得乐趣......

问题似乎与头文件的一些#includes有关:

#include <asm/page.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h>

尝试书中给出的代码:

> cc the_file.c
给出
致命错误:asm/page.h:没有此类文件或目录编译终止。

事实上,这些文件似乎存在于其他地方(现在?)所以我最初尝试将第一个 #include 修改为:

#include </usr/src/linux-headers-3.0.0-17-generic/include/asm-generic/page.h>    

我选择了这个特定的标题文件夹(/usr/src/ 中有几个),因为
> uname -r
3.0.0-17-generic

使用修改后的#include,我得到编译错误:

在 the_file.c
/usr/src/linux-headers-3.0.0-17-generic/include/asm-generic/page.h:96:38 包含的文件中:致命错误:asm-
generic/memory_model.h:否此类文件或目录
编译终止。

并查看该 page.h,它指定包含 asm-generic/memory_model.h(删除了散列和“标签”,否则该行将不会正确显示在此处),但该文件确实存在于同一文件夹中。

所以,在我继续追逐野鹅之前(首先删除前一个包含的 asm-generic/ 位并将其放在引号中),我应该在这里使用什么正确的程序?有没有明显正确的方法来编译本书的源代码?

谢谢你。将不胜感激任何帮助。

4

2 回答 2

3

两组不同的头文件:一组用于 Linux 内核编程,另一组用于一般用户空间程序。

/usr/src/linux* 用于内核的东西。

/usr/include/* 是“正常”标头。

不想将两者混合使用。

如果您正在编写游戏,我强烈建议您查看 SDL 或 OpenGL:

附录:

  1. 问题是您缺少 fbdev (用户空间)标头。您不想引入任何 Linux 内核源头文件。

  2. 您应该能够使用以下命令获取标题:

    sudo apt-get xserver-xorg-video-fbdev

  3. 您可能还需要引入其他依赖项 - apt-get 应该会告诉您。

'希望有帮助.. PSM

PS:

看来您的书“Programming Linux Games”也是一本备受推崇的 SDL 教程。

于 2012-04-26T22:22:19.570 回答
0

gcc的-I参数添加了一个目录来查找头文件。

gcc ... -I /usr/src/.../include ...
于 2012-04-26T22:21:59.350 回答