关于apue第二版(apue.2e)的源代码编译请参考点击打开链接。
下面是关于如何编译我们自己写的apue上的例子的程序。
以例子1为例。
假设文件名为exc.1.1.c,放在~/source目录下。
内容如下所示:
#include <dirent.h>
#include <apue.h>
int
main(int argc, char *argv[]){
DIR *dp;
struct dirent *drp;
dp = opendir(argv[1]);
if(dp==NULL)err_sys("can not open %s.", argv[1]);
while((drp=readdir(dp))!=NULL){
printf("%s\n",drp->d_name);
}
return 0;
}
我做了一点简化。
可以发现代码中直接以#include <apue.h>的形式使用apue提供的库文件的。这种方式gcc会从系统的文件目录下查找所需头文件,即/usr/include ,所以为了方便使用qpue库,第一步将apue.h复制到/usr/include目录中:
sudo cp ~/apue.2e/include/apue.h /usr/include/
如此一来,gcc可以顺利找到头文件apue.h了。头文件仅仅是含有相关的数据类型和函数原型的声明,gcc借助头文件可以完成对我们写的程序的编译工作,但是链接工作还没有办法完成。第二步,要完成链接工作就要将apue头文件对应的库实现链接进来,这个链接任务使用gcc的-l参数完成。所以我们只需要提交将apue的共享库提供就可以了。同头文件原理,gcc首先从系统的目录即/usr/lib中寻找所需的库文件,所以我们将apue的库文件,即编译apue后,在lib文件夹下的libapue.a文件,将之复制到/usr/lib中:
sudo cp ~/apue.2e/lib/libapue.a /usr/lib/
如此一来,最后,我们只要使用命令:
gcc -lapue -o exc.1.1 exc1.1.c
即可顺利编译。
这里说明下,gcc的-l参数,后面给出的所apue的库名。库名与库对应的文件名不同。apue库对应的库文件名是:lib + apue + .a ,这就是我们刚刚cp到/usr/ib文件夹中的那个文件。