编译《UNIX环境高级编程》中的第一个程序

如果直接编译myls.c,会报错
/tmp/cceQcwN0.o: In function `main':
myls.c:(.text+0x24): undefined reference to `err_quit'
myls.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld 返回 1

需要下载随书附带的源代码并编译所需的库文件
源代码下载:http://www.blogjava.net/Files/zellux/apue.linux3.tar.Z.zip
(下载后去掉.zip后缀)

apue/README 文件中有具体的编译方法,对于Linux系统比较简单,进入lib.rhlin目录,然后运行make,就会在apue目录下生成libmisc.a,以后编译的时候连接这个库就行了。

以书中的第一个程序myls.c为例
#include  < sys / types.h >
#include 
< dirent.h >

#include 
" ourhdr.h "

int  main( int  argc,  char *  argv[])
{
    DIR             
* dp;
    
struct  dirent    * dirp;

    
if  (argc  !=   2 )
        err_quit(
" a single argument (the directory name) is required " );

    
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 );
}

$ gcc myls.c libmisc.a
出现几个Warning:
libmisc.a(strerror.o): In function `strerror':
strerror.c:(.text+0x18): warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
strerror.c:(.text+0xf): warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
看来这本书的确太老了
$ ./a.out .
就会列出当前目录下的所有文件

你可能感兴趣的:(编译《UNIX环境高级编程》中的第一个程序)