免费注册 查看新帖 |

Chinaunix

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

如何使用APUE(advanced programming in unix)里的头文件之类的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-16 12:10 |只看该作者 |倒序浏览
我刚刚开始看Unix 环境高级编程, 里面很多例子要用到作者他自己写的apue.h, 然后我就去网站下了这本书的相关的源代码包.
最初我是直接把apue.h放在/usr/include下, 写程序时也include 了,可是编译程序时报错说 undefined reference to `err_sys' 之类的信息, 'err_sys' 是 apue.h里的
大家读这本书的时候有没有也搞过它的源代码, 请帮帮我, 谢谢大家

论坛徽章:
0
2 [报告]
发表于 2006-09-16 12:33 |只看该作者
先去看源码根目录下的readme.install等文件.

论坛徽章:
0
3 [报告]
发表于 2006-09-16 14:45 |只看该作者
我有经验,虽然我也只是个初学者。
建议不要用他的那个apue.h。
1。你就从最简单的include开始,然后用gcc编译,看报什么错误,然后根据错误添加相应的include就行。通常,用如下的include就可以了:
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#include  <unistd.h>
#include  <sys/types.h>
#include  <sys/wait.h>
#include  <signal.h>
#include  <pthread.h>


2。把err_sys这之类的告警信息全部换成 printf("*** erro!") 函数来打印就可以了。中间的具体错误串就根据具体程序了。

我用这种办法基本上都通过了编译。祝你成功,学好apue!

论坛徽章:
0
4 [报告]
发表于 2006-09-17 02:38 |只看该作者
像他那种出错处理如果找不到自己写一个不就得了
用这个
fprintf(stderr,"error:%s",strerror(errno))

论坛徽章:
0
5 [报告]
发表于 2006-11-03 23:17 |只看该作者
我简单说下我的处理方法,希望对大家有所帮助

1 先到你下载源代码的主目录下,找到 Make.defines.YOUR_OS 文件。比如说:我用的是solaris 就打开Make.defines.solaris。
2 将WKDIR改为你代码的安装目录
3 看到cc=gcc没有,一定要确保你的gcc正常运行,因为后面的编译用到了gcc的一些参数,而cc不支持这些参数
4 保存后直接make 就可以了

此时虽然你可以直接运行代码里的程序(都编译好了),但是你还是不能自己编译自己修改的.C文件。编译环境依然没有建立好。解决办法
如果你观察仔细的话就会发现,make的时候,系统是用如下的命令进行编译的
  1. /bin/gcc -I /apue.2e/include -Wall -DSOLARIS -D__EXTENSIONS__ -D_HAS_PTSNAME -D_HAS_GRANTPT -D_HAS_UNLOCKPT  -c  servlisten.c
复制代码

其中 /bin/gcc 是我的gcc 安装目录
     -I /apue.2e/include   指明要apue.h的目录 也就是指明头文件所在
     -Wall  可以列出一些警告信息
     -DSOLARIS -D__EXTENSIONS__ -D_HAS_PTSNAME -D_HAS_GRANTPT -D_HAS_UNLOCKPT
主要是指明一些宏定义,具体各个宏什么用我也搞不清楚。但是不加上有不行,如果不加的话,我这边会报出
  1. #error "Compiler or options invalid; UNIX 03 and POSIX.1-2001 applications      require the use of c99"
复制代码
的错误,不知道其他系统是不是这样。

      显然这时我们可以利用系统编译的模式(主要是指设定那些参数)去编译。为了方便使用,这时你就可以设定一个alias 。比如:
  1. alias gg="/bin/gcc -I /apue.2e/include -Wall -DSOLARIS -D__EXTENSIONS__ -D_HAS_PTSNAME -D_HAS_GRANTPT -D_HAS_UNLOCKPT"
复制代码
      
         当你进行编译时直接用gg yourfile 就可以了

     BTW:apue.h是保存在apue.2e/include下面

[ 本帖最后由 hongyunqi 于 2006-11-3 23:30 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-01-01 00:43 |只看该作者
楼上的兄弟,我也是刚开始看apue.2e呢,按照你的方法,我编译成功了apue.h 但是,为什么我编译书上的例子时,有报错啊,你可以给我说说为什么吗??错误如下:

  1. #gg myls.c
  2. /tmp/cc4037BE.o(.text+0x1f): In function 'main':
  3. : undefined reference to 'err_quit'
  4. /tmp/cc4037BE.o(.text+0x53):In function 'main':
  5. :undefined referece to 'err_sys'
  6. collect2:1d retruned 1 exit status
复制代码

由于初学,实在弄不明白啊,已经困绕好多天了,谢谢各位大侠解答!!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2007-01-01 00:48 |只看该作者
原帖由 Zcanoe 于 2007-1-1 00:43 发表
楼上的兄弟,我也是刚开始看apue.2e呢,按照你的方法,我编译成功了apue.h 但是,为什么我编译书上的例子时,有报错啊,你可以给我说说为什么吗??错误如下:
[code]
#gg myls.c
/tmp/cc4037BE.o(.text+0x1f) ...

那些是作者自己实现的函数,
用在自己写的程序里,
可以在源包中找到它们的代码。
应该先把它们编译成库文件,
然后你编译例子时,需要链接这些库。
这些应该在readme之类的文档中有说明呀。
没仔细看?

论坛徽章:
0
8 [报告]
发表于 2007-01-01 03:06 |只看该作者
谢谢 lenovo 大侠给我讲解,水平太差了,还是不行,还是同样的出错消息了,算了,还是用4楼的方法吧,已经弄很久了,没办法了,不想在这浪费时间了!!等以后,熟悉了再试吧!!

论坛徽章:
0
9 [报告]
发表于 2007-10-26 14:37 |只看该作者
经过编译apue的作者给出的代码包后
在 apue.2e/lib/libapue.a 下这个文件好像就是要用到的那个库文件,但我也很面 ,不知道怎么用这个库

论坛徽章:
0
10 [报告]
发表于 2007-12-11 07:29 |只看该作者
按照你的情况修改Make.defines.OS, 然后make
完成后按照如下方法编译链接生成elf可执行文件:

先对file/ls1.c进行编译,生成目标文件ls1.o:
gcc -c -I ../include -o ls1.o ls1.c
[说明]:-c 仅进行编译
        -I ../include 因为ls1.c有头文件apue.h在../include中,要指定其所在
        -o ls1.o 输出文件,因为前面有-c选项,所以输出文件是目标文件ls1.o,而不是可执行文件
再进行链接,生成可执行文件ls1:
gcc -o ls1 ls1.o ../lib/libapue.a
[说明]:-o ls1 输出可执行文件
        ls1.o ../lib/libapue.a 将所需的目标文件和库文件链接生成可执行文件。

运行./ls1 /    就可查看/目录下的文件了。

对gcc使用不熟的可以man gcc,里面很详细;
上面方法嫌麻烦的话,可以写成makefile文件,make一下就行了。不过建议初学者还是先用这种方法,熟悉熟悉编译链接等的一些知识。
欢迎大家一起来讨论。

[ 本帖最后由 joeguan2 于 2007-12-11 07:31 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP