免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1165 | 回复: 0
打印 上一主题 下一主题

APUE 1st Edition 源代码的编译问题的简单解决办法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-07 22:33 |只看该作者 |倒序浏览

       
       
        哎呀,经过一番努力,Advanced
Programming in the Unix Environment 1[color="#000000"]st
Edition的代码我终于知道是怎么跑的了.
        首先在作者的网站www.kohala.com/start上面下载apue.linux3.tar.Z源代码包,之后再Linux中用命令[color="#000000"]"tar
xzvf apue.linux3.tar.Z[color="#000000"]"解压缩成文件夹apue即可.
        [color="#000000"]"cd[color="#000000"]"进入apue目录,阅读DISCLAIMER,Make.def.rhlin,Sourcefiles,README等几个文件.        其中DISCLAIMER文件中的内容可以不做阅读,我也没细看...
        Sourcefiles文件中的内容是源代码的组织结构,和书中的代码编号是一一对应的.比如Sourcefiles文件中的"1.1
file/ls1.c"就对应着书中正文第4页的"Program
1.1 List all the files in a
directory."以后可以按照Sourcefiles文件中的顺序来对应书中的代码.
        之后修改Make.def.rhlin文件,将其中的"LDLIBS=/home/thanlon/apue/libmisc.a        #th"和"LIB        =
/home/thanlon/apue/libmisc.a        #th"替换成自己放置apue文件夹的位置,这个[color="#000000"]"libmisc.a[color="#000000"]"文件就是我们编译之后所生成的库文件.
        最后阅读README文件.此文件中完整的描述了如何[color="#000000"]"make[color="#000000"]"出来[color="#000000"]"libmisc.a[color="#000000"]"文件.首先通过作者的介绍明白了用":set
tabstop=4"命令可以把vi中tab的距离设置成4个字符.先通读一遍[color="#000000"]"PART
ONE by W. Richard
Stevens[color="#000000"]",大致了解一下这些文件在正常的Unix系统上应该如何编译.因为本书第一版的年代比较久远了,所以这个第一部分了解一下即可,让我们知道大致流程是什么,重点是看第二部分.
        README文件的第二部分[color="#000000"]"PART
TWO - Linux Redhat 6.0 specific[color="#000000"]",这个经过测试在RHEL
5.1下可以编译通过.步骤如下:
        Read
PART ONE.
        Edit
/apue/Make.def.rhlin so it contains the proper directories to store
your library in after it is compiled.
[color="#800000"]        [color="#800000"]也就是上面我说的把[color="#800000"]"LDLIBS=/home/thanlon/apue/libmisc.a        #th"[color="#800000"]和"LIB        =
/home/thanlon/apue/libmisc.a        #th"[color="#800000"]替换成自己放置[color="#800000"]apue[color="#800000"]文件夹的位置[color="#800000"],[color="#800000"]这个[color="#000000"]"[color="#800000"]libmisc.a[color="#000000"]"[color="#800000"]文件就是我们编译之后所生成的库文件[color="#800000"].
        Copy
Make.def.rhlin to the new file Make.defines (in the apue directory at
the shell do %cp Make.def.rhlin Make.defines).
[color="#800000"]        也就是把"Make.def.rhlin
[color="#000000"]"这个文件copy成一个叫做[color="#000000"]"Make.defines[color="#000000"]"的文件,直接敲作者给的命令就可以了.
        Switch
to the apue/lib.rhlin directory.
[color="#800000"]        之后"cd[color="#000000"]"到[color="#000000"]"apue/lib.rhlin[color="#000000"]"这个文件夹.
        At
the shell execute the command "make". I usually do a "make
> op 2> eop" so that standard output is stored in the new
file op and standard error is in new file eop. That way if you have
problems you have a file to print as documentation to show to your
expert.
[color="#800000"]        先看一眼"systype.sh[color="#000000"]"这个文件,一般不会有什么问题,之后直接在当前目录下面[color="#000000"]"make[color="#000000"]"命令即可,不过像作者介绍的[color="#000000"]"make
> op 2> eop[color="#000000"]"可也以.[color="#000000"]"make[color="#000000"]"之后不出意外便以正确的话,系统直接打印新的命令提示符了.
        That
is it if you are using rh6.0 or on an intel machine.
[color="#800000"]        到了这一步[color="#000000"]"libmisc.a"[color="#000000"]这个文件就算编译好了[color="#000000"].
[color="#800000"]        [color="#000000"]下一步就是运行代码了[color="#000000"].[color="#000000"]有些文件比如Program
1.4 [color="#000000"]的"Print
the process ID.",[color="#000000"]直接用命令"gcc
hello.c -o hello"[color="#000000"]即可编译出[color="#000000"]hello[color="#000000"]文件[color="#000000"],[color="#000000"]并可直接用命令[color="#000000"]"./hello"[color="#000000"]来运行[color="#000000"].[color="#000000"]但有的文件比如Program
1.2 [color="#000000"]的"Copy
standard input to standard output."[color="#000000"]程序[color="#000000"].[color="#000000"]直接用"gcc
mycat.c -o mycat"[color="#000000"]命令来编译就会出现[color="#000000"]"        /tmp/cc27IEoZ.o:
In function `main':
                        mycat.c:(.text+0x40):
undefined reference to `err_sys'
                        mycat.c:(.text+0x79):
undefined reference to `err_sys'
                        collect2:
ld returned 1 exit status[color="#000000"]"[color="#000000"]的提示[color="#000000"].[color="#000000"]这个具体原因可能是因为作者另外自己编写的"Standard
Error Routines"[color="#000000"]文件没有包含进去[color="#000000"].
        我们可以通过回到apue/lib.rhlin文件夹下面,拷贝出"error.o"文件至我们所需要编译的文件的文件夹,比如"cp
error.o
../mycat/"下面即可.之后在编译的时候我们可以编写Makefile文件来直接用make命令编译,也可以通过命令"        $gcc
-c mycat.c
                                                        $gcc
mycat.o error.o -o mycat
                                                        $./mycat"
[color="#000000"]来运行[color="#000000"].[color="#000000"]这样我们就可以很好的使用Advanced
Programming in the Unix Environment 1[color="#000000"]st
Edition[color="#000000"]的随书源代码了[color="#000000"].
[color="#000000"]       
[color="#000000"]        经测试,此源代码可以通过putty.exe使用SSH协议登陆,在Windows
XP Professional Edition SP3下的VMware
Workstation 6.5.1 build-126130内安装的Redhat
Enterprise Linux 5.1和Ubuntu
9.10下通过测试.
最后想说的就是,任何东西,只要认真看了,好像都能看懂...最少弄不懂原理但是能明白怎么弄...以后还是不要浮躁,沉下心来好好研究研究这些东西吧!
[color="#000000"]为考T努力!为熟悉的在Linux环境下用C编程努力!
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104863/showart_2089107.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP