">{
printf("Youneedinputthedirectoryname.n");
exit(1);
if((dp=opendir(argv[1]))==NULL)
printf("cannotopen%sn",argv[1]);
exit(1);
while((dirp=readdir(dp))!=NULL)
printf("%sn",dirp->d_name);
closedir(dp);
exit(0);
这样更改后的程序早已与作者的头文件"ourhdr.h"没有关系,可以单独的进行编译。我使用的是root用户,执行命令:
#gcc1-1.c//生成目标文件a.out
或则
#gcc-o1-11-1.c//生成目标文件1-1
没有任何错误和警告linux伊甸园,说明编译成功。这时我们执行生成的目标文件:
#./a.out/home
或则
#./1-1/home
则会列举/home路径下的所有文件,包括目录(.)和(..)。
通过这样的方式,基本上我们可以将该书中所有的解释器更改成不包含"ourhdr.h"的程序。这样,我们就可以单独的编译每一个解释器红帽子linux下载,而不用顾及作者所给的杂凑的头文件。同时这些比较笨的方式,反倒有利于帮助我们了解不同系统调用所对应的头文件,对于学习来说,这应当是一件好事。
如今,我也才学到APUE的第四章了。前四章的程序,我都是采用这些方式进行编译和运行。假如也有在学习APUE的同学,我们可以一起交流。
APUE2作者提供的源码编译方式及单个源码编译的实现
根据源代码文件夹中的README的步骤,对整个源代码进行了编译。
(一)作者提供的编译方式的实现
README文件中给出的编译方式如下:
Tobuildthesource,edittheMake.defines.*fileforyoursystemandsetWKDIRtothepathnameofthetreecontainingthesourcecode.Thenjustrun"make".Itshouldfigureoutthesystemtypeandbuildthesourceforthatplatformutomatically.
参照该方式,我将源码的编译分为三步。整个步骤都是在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文件不具有可执行的权限。通过执行命令:
#chmod+xsystype.sh
给当前用户及其所在组和其他组添加可执行权限;
或则
#chmodu+xsystype.sh
仅给当前用户添加可执行权限。
该脚本文件的功能主要是测量操作系统的类型。它可以测量到系统的类型有:FreeBSD,Linux,MacOS和Solaris等。假如单独执行这个shell脚本:
#./systype.sh
则输出结果为:freebsd。即检查本机的操作系统为FreeBSD。
第三步,进行源码的编译。在命令行下执行make命令。通过查看Makefile文件可知,make以后,首先执行systype.sh脚本,即首先确定操作系统的类型,之后在进行源码的编译。在编译的过程中,会有一些Warning。那些都是正常的,致使警告的缘由可能是采用编译起的版本不同或则是同一类型操作系统的版本不同。并且,只要make的过程不出现error,都会顺利的生成可执行文件。我的在编译过程中没有出现error,因而意味着编译成功。
注意:编译的过程中可能会出现的一个问题,也是一个网友以前问到的问题,就是在编译中出现这个的错误,提示nawkcommandcannotbefound。这个问题可能的诱因是,有些操作系统的内核版本较低,可能还不支持nawk(newawk)这个命令。但应当支持awk命令。为此,问题的解决方式就是将相关文件中的nawk命令替换为awk,或则为系统添加一某些名alias,aliasnawkawk。这样在编一的过程中,遇见nawk命令时,实际会去执行
ng=EN-US>awk命令。假如还有其他问题,可以去网上搜索相关的解决方式。由于我在编译的过程中没有碰到这样的问题unix环境高级编程 3 编译,不再一一赘言。
(二)编译生成可执行文件的位置
在路径/home/apue.2e/下其实有所有的源文件,都是以figx.x的方式命名。并且实际编译的过程并不是编译的那些文件。而是编译在该路径下各个文件夹中的后缀名为*.c的程序。作者把同一章节或则相仿几个章节的源代码放到某一个文件夹下边(include和lib文件夹除外)。而文件夹的命名通常是和该章对应的标题是一致的,采用的是英语标题的全称或缩写。例如,advio文件夹对应Chapter14.AdvancedI/O,该章的代码就置于该文件夹下边。还有文件夹proc对应Chapter8.ProcessControl,文件夹termios对应Chapter18.TerminalI/O等等,基本上每一章的代码都可以在这种文件夹中找到。
(三)怎样编译单独的源文件
通过make命令是直接将所有的源程序编译成可执行文件的。对于喜欢更改和调试程序的同学来说,make生成的可执行文件或许不具有这样的功能,但是,也不可能更改了一个源文件,之后还要make。怎么须要编译和调试单个程序的话,技巧如下:
1.首先还是要用make对所有文件进行编译。成功编译后unix环境高级编程 3 编译,会在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中的所有功能,主要有常用头文件,宏定义以及自定义函数的实现。
输入命令
#gccfig1.3.clib/libapue.a
则会生成可执行文件a.out。执行命令
#./a.out/home
则列举我的/home路径下的所有文件和文件夹:
..
david
simsun.ttc
simkai.ttf
simsun.ttf
MYKERNEL
unix_advance_program
freebsd
APUESourceCode
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"
以及编译是库文件的位置也相应更改,改为:
#gccsourcefile.c../lib/libapue.a
至此,APUE第二版作者提供的源码编译方式和单独源码的编译都早已实现。