svgalib的移植

  svgalib是一套运行于Linux及FreeBSD下的开放源代码低阶绘图函式库,它允许程式设计人员变更视讯模式及全屏幕图像。它提供了函数接口使得linux的图形显示更容易。

  svga的移植步骤:

  1)下载svgalib

    下载地址:https://launchpad.net/ubuntu/+source/svgalib/1:1.4.3-30
    下载文件:svgalib_1.4.3.orig.tar.gz             // svgalib压缩安装文件
                  svgalib_1.4.3-30.debian.tar.gz    // svgalib压缩补丁文件
                  svgalib_1.4.3-30.dsc                  // 文件描述

  2)解压缩

    解压缩svgalib压缩安装文件:tar xzf svgalib_1.4.3.orig.tar.gz

    解压缩svgalib压缩补丁文件:tar xzf svgalib_1.4.3-30.debian.tar.gz

  3)打补丁

    进入svgalib目录:cd svgalib-1.4.3.orig/

    打补丁:for file in ../debian/patches/*.patch; do patch -p1 < $file; done

  4)编译安装:   

    sudo make install

  此时会编译出错,编译出错信息为:未定义libx86.h,需要安装libx86

  5)下载libx86

    下载地址:http://packages.ubuntu.com/lucid/libx86-1

    下载文件:libx86_1.1+ds1.orig.tar.gz     // libx86压缩安装文件

         libx86_1.1+ds1-6.diff.gz        // libx86压缩补丁文件

  6)解压缩

    解压缩libx86压缩安装文件:tar xzf libx86_1.1+ds1.orig.tar.gz 

    解压缩libx86压缩补丁文件:gunzip libx86_1.1+ds1-6.diff.gz

  7)打补丁

    进入libx86目录:cd libx86-1.1/

    打补丁:patch -p1 < ../libx86_1.1+ds1-6.diff

  8)编译安装

    make

  此时又会有一个错误,错误消息提示:“IF_MASK”未定义

  google search搜索得到一个补丁文件,阅读补丁文件得知为向lrmi.c中添加宏定义。

  9)添加宏

    向lrmi.c中添加宏定义如下:

    #if defined(__linux__) && !defined(TF_MASK)

      #define TF_MASK X86_EFLAGS_TF
      #define IF_MASK X86_EFLAGS_IF
      #define VIF_MASK X86_EFLAGS_VIF
      #define IOPL_MASK X86_EFLAGS_IOPL
    #endif

  10)跳至第8步

    编译:make

    安装:sudo make install

  11)跳至第4步

    安装:sudo make install

  至此,终于将svgalib库函数安装完毕。

  下面来写一个test.c

  #include

  #include
  #include

  int main(void)
  {
    int x, y;

    vga_init();
    vga_setmode(G320x200x256);
    gl_setpalettecolor(4, 0xE7>>2, 0xDB>>2, 0xB5>>2);    // 设置要显示的颜色
    vga_setcolor(4);

    for (x = 0; x < 320; x++)
    for (y = 0; y < 200; y++)
    vga_drawpixel(x, y);

    sleep(5);
    vga_setmode(TEXT);

    return EXIT_SUCCESS;
  }

  编译:gcc  test.c -o est -lvga -lvgagl

  运行:sudo ./test

  这里遇到了点错误:libvga.so.1:cannot open shared object file:No such file or directory

  在svgalib安装目录下搜索:find -name "libvga.so.1"

  在网上搜索我得到了以下三种解决办法: 

  1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
    ln -s /where/you/install/lib/*.so /usr/lib
    sudo ldconfig
  

  2.修改LD_LIBRARY_PATH

    export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH
    sudo ldconfig
 

  3.修改/etc/ld.so.conf,然后刷新

    vim /etc/ld.so.conf
    sudo ldconfig
 
  采用第一种办法,将libvga.so.1文件链接到/usr/lib目录下,刷新后重新运行test文件,成功得到一块指定颜色的空间域。
  明明有libvga.so.1共享库文件可是却为找到,这是为什么呢?以下为在网上找到的解释:

    库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件 的搜索路径有下列两种方式,可任选其一使用:

  1、在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。   

                   个别情况下还是不识别,或者就是配置的有问题,写这篇文档就是因为环境变量配置了但是不识别

  2、在 /etc/ld.so.conf 文件中添加库的搜索路径。

  将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择

  添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:

   /usr/X11R6/lib

   /usr/local/lib

   /opt/lib

   需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不 够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache 以供使用。因此当安装完一些库文件,(例如刚安装好 glib),或者修改ld.so.conf增加新的库路径后,需要运行一下 /sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不 会被使用 的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。

  在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。

  前面已经说明过了,库搜索路径的设置有两种方式:在环境变量 LD_LIBRARY_PATH 中设置以及在 /etc/ld.so.conf 文件中设置。其中,第二种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令。而且,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK 库。不幸的是,由于 GTK 版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在 GTK 及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行。这种设置方式不需要 root 权限,设置也简单:

  $ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

  可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:

  $ echo $LD_LIBRARY_PATH

  至此,库的两种设置就完成了。

  End.
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/ZXNblog/p/4023037.html

你可能感兴趣的:(操作系统,人工智能,开发工具)