背景说明:
学习《UNIX环境高级编程》,里面的示例程序用到了作者写的模块。
把第一个示例代码敲入,结果当头一棒。
咦,怎么编不过去。
网上找资料发现好人不少,问题终于解决。
特此,把我的解决步骤附上如下。^_^
参考文章:
http://linux.chinaunix.net/techdoc/system/2009/02/08/1061504.shtml
http://blog.csdn.net/discxuwei/article/details/5377145
这个最详细也将了unp.h的问题:
http://www.cnblogs.com/feiling/archive/2012/02/15/2353286.html
操作系统:Ubuntu 10.04 LTS。
环境配置步骤如下。
1、 下载源文件:http://www.apuebook.com/src.tar.gz。
2、 复制src.tar.gz文件到/home/me/mydir/unixl/目录(自建目录)下。
3、 解压缩后生成apue.2e目录文件。(我自己放在/home/fengpeng/目录下)
4、 修改文件apue.2e/ Make.defines.linux。
WKDIR=/home/fengpeng/apue.2e
这里就是我们将要make的工作目录,然后进入std目录,用vi打开linux.mk,将里面的nawk全部改成awk
(make的目的是产生静态库文件,我们以后编程都需要用到的,libapue.a以及头文件apue.h)
5、 apue.h中的ARG_MAX未定义,我们在apue.2e/include/apue.h中加入一行
#define ARG_MAX 4096
在apue.h中的最后一行#endif前面一行添加
#include "error.c"
修改文件apue.2e/ threadctl目录下getenv1.c、getenv3.c,添加一行:
#include "apue.h"
6、 将apue.h和error.c两个文件复制到/usr/include中
(这里需要root权限,apue.h位于 apue.2e/inlcude ; error.c位于apue.2e/lib )
$sudo cp ~/apue.2e/lib/error.c /usr/include
$sudo cp ~/apue.2e/include/apue.h /usr/include
7、 apue.2e源文件编译,依次执行命令
$cd apue.2e
$make
8、 复制apue.2e/lib/libapue.a到目录/usr/lib/。
#sudo cp lib/libapue.a /usr/lib/
9、 /home/fengpeng/apue.2e/目录创建示例程序myls.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't open %s", argv[1]);
while ((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
return 1;
}
10、编译并运行示例程序
$gcc -Wall myls.c -o myls
$./myls .
注意在运行的时候要注意gcc的参数