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

该程序是John R. Hall等人于2001年出版的编程Linux游戏一书中的“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通用

使用修改后的#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/位并将其放在引号中)之前,我应该在此处使用的正确步骤是什么?有没有一种显而易见的正确方法可以使本书的源代码进行编译?

谢谢。将非常感谢您的帮助。

最佳答案

头文件有两组,一组用于Linux内核编程,另一组用于常规用户空间程序。

/usr/src/linux *用于内核。

/usr/include/*是“普通” header 。

您不想将两者混为一谈。

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

  • http://www.linuxjournal.com/article/6410
  • http://content.gpwiki.org/index.php/SDL:Tutorials
  • http://www.opengl.org/wiki/Getting_Started
  • http://www.dreamincode.net/forums/topic/63945-game-programming-in-linux-for-windows-programmers-part-1/

  • 附录:
  • 问题是您缺少fbdev(用户空间) header 。您不想引入任何Linux内核源 header 。
  • 您应该可以使用以下命令获取 header :
    sudo apt-get xserver-xorg-video-fbdev
  • 您可能还需要引入其他依赖项-apt-get应该告诉您。

  • '希望有帮助.. PSM

    PS:

    看来,您的《 Programming Linux Games》一书也是有关SDL的备受推崇的教程。

    关于c - #在Ubuntu上的旧C源代码(page.h等)中包含某些头文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10342164/

    10-11 22:54
    查看更多