快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

新葡新京论坛:APUE2作者提供的源码编译方法及单个源码编译的实现



前面一篇文章解说了《U新葡新京论坛NIX情况高档编程》源码编译措施。文中所讲到的编译措施长短作者供给的编译措施,即不应用作者供给的头文件,法度榜样中所有应用的头文件都逐一列出。而法度榜样中的掉足处置惩罚函数则简单的用printf函数替代。

随后,也有网友提出若何采纳作者的措施来对所有的法度榜样进行编译。出于办理问题,同时也想实现这个措施,终究实现之后每个法度榜样都可以直接运行,照样对照方便的。是以,就按照源代码文件夹中的README的步骤新葡新京论坛,对全部源代码进行了编译。

(一)作者供给的编译措施的实现

README文件中给出的编译措施如下:

To build the source, edit the Make.defines.* file for your system and set WKDIR to the pathname of the tree containing the source code.Then just run "make".It should figure out the system type and build the source for that platform utomatically.

参照该措施,我将源码的编译分为三步。全部步骤都是在root超级用户下进行的,假如其他用户没有权限进行编译,可以经由过程su敕令切换到超级用户。

第一步,编辑Make.defines.*文件。因为我所应用的操作系统是FreeBSD6.1,以是应该编辑文件Make.defines.freebsd。着实,编辑该文件的内容主如果改动此中的WKDIR,即我们源码所在文件夹的绝对路径名。原文件中WKDIR=/home/sar/apue.2e,我们可以根据我们实际文件夹所在的位置进行响应的改动。我的apue.2e文件夹直接放在/home下了,以是我将WKDIR改动为WKDIR=/home/apue.2e。另外内容不用改动,保存改动后的文件。

第二步,改动脚本文件systype.sh的权限。因为原始的systype.sh文件不具有可履行的权限。经由过程履行敕令:

#c新葡新京论坛hmod +x systype.sh

给当前用户及其所在组和其他组添加可履行权限;

或者

#chmod u+x systype.sh

仅给当前用户添加可履行权限。

该脚本文件的功能主如果检测操作系统的类型。它可以检测到系统的类型有:FreeBSD,Linux,MacOS和Solaris等。假如零丁履行这个shell脚本:

#./systype.sh

则输出结果为:freebsd。即检测本机的操作系统为FreeBSD。

第三步,进行源码的编译。在敕令行下履行make敕令。经由过程查看Makefile文件可知,make之后,首先履行systype.sh脚本,即首先确定操作系统的类型,然后在进行源码的编译。在编译的历程中,会有一些Warning。这些都是正常的,导致警告的缘故原由可能是采纳编译起的版本不合或者是同一类型操作系统的版本不合。然则,只要make的历程不呈现error,就会顺利的天生可履行文件。我的在编译历程中没有呈现error,是以意味着编译成功。

留意:编译的历程中可能会呈现的一个问题,也是一个网友曾经问到的问题,便是在编译中呈现这个的差错,提示nawk command cannot be found。这个问题可能的缘故原由是,有些操作系统的内核版本较低,可能还不支持nawk(new awk)这个敕令新葡新京论坛。但应该支持awk敕令。是以,问题的办理措施便是将相关文件中的nawk敕令调换为awk,或者为系统添加一个又名alias,alias nawk awk。这样在编一的历程中,碰到nawk敕令时,实际会去履行awk敕令。假如还有其他问题,可以去网上搜索相关的办理措施。由于我在编译的历程中没有碰到这样的问题,不再逐一赘述。

(二)编译天生可履行文件的位置

在路径/home/apue.2e/下虽然有所有的源文件,都因此figx.x的形式命名。然则实际编译的历程并不是编译的这些文件。而是编译在该路径下各个文件夹中的后新葡新京论坛缀名为*.c的法度榜样。作者把同一章节或者邻近几个章节的源代码放在某一个文件夹下面(include和lib文件夹除外)。而文件夹的命名一样平常是和该章对应的标题是同等的,采纳的是英文标题的全称或简写。譬如,advio文件夹对应Chapter 14. Advanced I/O,该章的代码就放在该文件夹下面。还有文件夹proc对应Chapter 8. Process Control,文件夹termios对应Chapter 18. Terminal I/O等等,基础上每一章的代码都可以在这些文件夹中找到。

(三)若何编译零丁的源文件

经由过程make敕令是直接将所有的源法度榜样编译成可履行文件的。对付爱好改动和调试法度榜样的同伙来说,make天生的可履行文件显然不具有这样的功能,而且,也弗成能改动了一个源文件,然后还要make。若何必要编译和调试单个法度榜样的话,措施如下:

1.首先照样要用make对所有文件进行编译。成功编译后,会在WKDIR/lib/下天生库文件libapue.a,主如果将apue.h(位于WKDIR/include/)中定义的所有内容天生一个静态的库,这样可以方便调用。

2.我们以WKDIR/下的fig1.3(实现ls部分功能)文件为例阐明必要改动的地方。将fig1.3文件重命名为fig1.3.c,然后编辑该文件,将包孕头文件的一行代码:

#include "apue.h"//默认所引用头文件的位置为当前的路径WKDIR=/home/apue.2e

改动为

#include "include/apue.h"

即头文件apue.h的位置为当前路径下inlucde文件夹中,这个就精确的指定了apue.h的位置。

这样就可以进行编译了,但在编译的时刻还要加上库文件libapue.a,由于该文件实现了apue.h中的所有功能,主要有常用头文件,宏定义以及自定义函数的实现。

输入敕令

#gcc fig1.3.c lib/libapue.a

则会天生可履行文件a.out。履行敕令

#./a.out /home

则列出我的/home路径下的所有文件和文件夹:

.

..

david

simsun .ttc

simkai.ttf

simsun.ttf

MYKERNEL

unix_advance_program

freebsd

APUE Source Code

LumaQQ

apue.2e

bash-script

lumaqq_2005_patch_2006.01.22.15.00.zip

lumaqq_2005-linux_gtk2_x86_with_jre.tar

apue_src_complied.tar

当然,假如必要编译的是各个文件夹中的一个源法度榜样时,则只需对所包孕的头文件apue.h的路径作相对改动,改为

#include "../include/apue.h"

以及编译是库文件的位置也响应改动,改为:

#gcc sourcefile.c ../lib/libapue.a

至此,APUE第二版作者供给的源码编译措施和零丁源码的编译都已经实现

您可能还会对下面的文章感兴趣: