从零开始UNIX环境高级编程(0):Linux下运行第一个程序

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 

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/ , 选择对应版本。

从零开始UNIX环境高级编程(0):Linux下运行第一个程序_第1张图片
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

你可能感兴趣的:(从零开始UNIX环境高级编程(0):Linux下运行第一个程序)