从零开始UNIX环境高级编程(0):Linux下运行第一个程序
2017-01-06 本文已影响391人
伤口不该结疤
0. 准备
UNIX环境高级编程(简称APUE)书中要求使用cc进行编译。 Linux上执行cc对应调用的还是gcc,所以只要安装了gcc,就能够编译。验证过程如下:
root@ubuntu:/home/ckt/work/unix/code# which cc
/usr/bin/cc
root@ubuntu:/home/ckt/work/unix/code# ls -al /usr/bin/cc
lrwxrwxrwx 1 root root 20 Nov 26 2014 /usr/bin/cc -> /etc/alternatives/cc
root@ubuntu:/home/ckt/work/unix/code# ls -al /etc/alternatives/cc
lrwxrwxrwx 1 root root 12 Nov 26 2014 /etc/alternatives/cc -> /usr/bin/gcc
1. 编译
编辑列出一个目录中所有文件名字的例子
ckt@ubuntu:~/work/unix/code$ vi ls_test.c
#include "apue.h"
#include <dirent.h>
int main(int argc, char const *argv[])
{
DIR *dp;
struct dirent *dirp;
if (argc != 2)
err_quit("eeee");
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);
exit(0);
}
执行cc ls_test.c 进行编译,会报错"apue.h: No such file or directory"
ckt@ubuntu:~/work/unix/code$ cc ls_test.c
ls_test.c:1:18: fatal error: apue.h: No such file or directory
compilation terminated.
2. 下载apue源码
apue是Advanced Programming in the UNIX Environment的缩写,apue.h是作者自己定义的头文件。因此,需要从APUE的网站上下载源码,导入apue.h等编译依赖的文件。
APUE网站:http://www.apuebook.com/ , 选择对应版本。
APUE下载完成以后,将其解压。
ckt@ubuntu:~/work/unix/code$ wget http://www.apuebook.com/src.3e.tar.gz
ckt@ubuntu:~/work/unix/code$ ls
ls_test.c src.3e src.3e.tar.gz
3. 复制apue.h到/usr/include/
缺少的apue.h位于/apue.3e/include路径下,将其复制到/usr/include/,需要root权限
ckt@ubuntu:~/work/unix/code/src.3e$ cp ./apue.3e/include/apue.h /usr/include/
cp: cannot create regular file `/usr/include/apue.h': Permission denied
4. 重新编译
重新编译,报错undefined reference to `err_quit',需要找到err_quit声明的头文件,将其导入。
root@ubuntu:/home/ckt/work/unix/code# cc ls_test.c
/tmp/cc4mpAeU.o: In function `main':
ls_test.c:(.text+0x20): undefined reference to `err_quit'
ls_test.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld returned 1 exit status
5. 复制error.c到/usr/include/
由于/usr/include/已经存在error.h,因此不能直接复制。
root@ubuntu:/home/ckt/work/unix/code# ls -l /usr/include/ | grep erro
-rw-r--r-- 1 root root 2132 Aug 27 2014 error.h
6. 复制error.c到/usr/include/,并修改/usr/include/apue.h。
在apue.h文件末尾的#endif /* _APUE_H */前面添加代码#include "error.c",然后保存文件。
root@ubuntu:/home/ckt/work/unix/code# cp ./src.3e/apue.3e/lib/error.c /usr/include/
root@ubuntu:/home/ckt/work/unix/code# cd /usr/include/
root@ubuntu:/usr/include# vi apue.h
7. 重新编译
重新编译后,没有报错,生成了a.out
root@ubuntu:/home/ckt/work/unix/code# cc ls_test.c
root@ubuntu:home/ckt/work/unix/code# ls
a.out ls_test.c src.3e src.3e.tar.gz
8. 运行
运行a.out,显示出当前目录下有哪些文件
root@ubuntu:/home/ckt/work/unix/code# ./a.out ./
src.3e
..
a.out
src.3e.tar.gz
.
ls_test.c
9. 参考
http://www.01happy.com/unix-advanced-programming-apue/
http://www.cnblogs.com/zhouyinhui/archive/2010/02/01/1661078.html