《Unix环境高级编程》非常详细的介绍了在UNix\linux环境下用C编程的重要问题,但是第一章开始却没有介绍如何正确的配置作者设定的开发环境。特别是找不到apue.h文件。显示如下的问题:
错误:apue.h:没有那个文件或目录
apue.h是作者定义的文件,包含了某些标准系统头文件,其代码结构并不复杂,但是书中几乎每一个程序都包含此文件,对于一个新手该如何运行起第一程序呢?
【第一步】:配置开发环境。
到http://www.apuebook.com/下载src.tar.gz包,该书现在分为92、05版和13版,笔者使用的是第二版,因此下载了第二个,然后解压至电脑中的某个目录,比如我的是在/home/walfred/Unix/下,然后做如下修改:
①进入解压目录apue.2e,修改 Make.defines.linux中的WKDIR=/home/xxx/apue.2e,改为文件所在的目录,例如,笔者的为WKDIR=/home/walfred/Unix/apue.2e
②进入std目录,修改linux.mk,将里面的nawk全部改为awk。
③复制apue.h和error.c
将apue.h和error.c两个文件copy到/usr/include目录下。(apue.h位于 your_apue_path/inlcude ; error.c位于your_apue_path/lib ),例如:
cp /home/walfred/Unix/apue.2e /usr/include/
cp /home/user/apue.2e /usr/include/ (实现apue.h中的出错处理函数)
假如执行上面的代码时给出不能复制文件的提示,则在两个命令前面都加上 sudo 。
至此,基本的配置文件就做好了。
【第二步】:在home/下建立一个文件夹,然后建立一个.c文件,我们将第一文件命名为hello.c文件,输入代码:
#include<apue.h>
#include<dirent.h>
int main(int argc,char*argv[])
{
DIR *dp;
struct dirent *dirp;
if(argc!=2)
err_quit("usage :ls directory_name");
if((dp=opendir(argv[1]))==NULL)
err_sys("can not open %s ",argv[1]);
while((dirp=readdir(dp))!=NULL)
printf("%s\n",dirp->d_name);
closedir(dp);
exit(0);
}
【第三步:编译】
该如何将该程序执行起来呢?可以执行下面几条命令
【1】预处理
命令格式为 gcc -E -o [目标文件] [编译文件]
GCC的选项“-E”可以使编译器在预处理结束时就停止编译,否则执行下一个阶段的时候,会产生大量错误,选项“-o”是指定GCC输出的结果。
例如,上面的文件编译命令为:
gcc -E -o hello.i hello.c
【2】编译阶段
gcc -S -o hello.s hello.i
“-S”使编译器在进行完汇编之前就停止。“.s”是汇编语言原始程序。
【3】汇编阶段
gcc -c hello.s -o hello.o
【4】链接阶段
gcc hello.o -o hello
【5】执行
./hello /home
则此时就会将 home下的文件名都显示出来。
至此第一个程序就运行起来了。