小白在学习unix环境高级编程中,想试试书中的代码,遇到点问题,记录下来。
APUE中有一个apue.h的头文件,是作者编写的头文件,想要运行书中的代码必须要用到这个头文件。头文件中声明和定义的方法的源代码在http://www.apuebook.com/src.tar.gz可下载。解压之后会生成一个apue.2e的目录,网上有很多在各种平台下如何编译的文章,按大家介绍的方法编译完成之后,一般都建议将apue.h及error.c放到/usr/include下,一来我经常用的帐号没有写/usr/include的权限,二来在有root权限的机器上试过,将error.c及libapue.a直接放到/usr/include并不管用,遂放弃。还有建议将apue.h及error.c直接放在代码所在的目录下,编译时加上.c文件就行,但是总感觉这样不行。难道我调用一个函数,都要去apue的源代码包中将包含函数定义的.c文件移到工作 目录下?编译的时候都得加上?既然编译apue.2e目录都没有问题,也不需要root权限,肯定有其它方法的,所以在apue.2e下建了一个目录作为放测试代码的目录尝试开发环境是RH5.1。目录结构如下:
$/HOME/apue.2e
在apue.2e下新建了一个apueTest目录:$/HOME/apue.2e/apueTest
在$/HOME/apue.2e/apueTest下写了一段测试代码vfork.c,代码内容来自书中。
#include "apue.h"
int glob = 6;
int main(void)
{
int var;
pid_t pid;
var= 88;
printf("before vfork\n");
if((pid = vfork()) < 0)
{
err_sys("vfork error");
}
else if(pid == 0)
{
glob++;
var++;
exit(0);
}
printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);
exit(0);
}
根据apue.2e其它子目录下的.mk文件,在此目录下创建Makefile文件
include ../Make.defines.linux
EXTRA=
PROGS = vfork
all: vfork
.PHONY: clean cleanvf
clean:
$(RM) ${PROGS} ${TEMPFILES} *.o
然后make,编译成功
gcc -DLINUX -ansi -I/testuser/apue.2e/include -Wall -D_GNU_SOURCE -L../lib vfork.c ../lib/libapue.a -o vfork
但是我直接执行“gcc -DLINUX -ansi -I/testuser/apue.2e/include -Wall -D_GNU_SOURCE -L../lib vfork.c ../lib/libapue.a -o vfork”会报如下错误,这个不知道为嘛 - -
/tmp/cceNppD7.o: In function `main':
vfork.c:(.text+0x3f): undefined reference to `err_sys(char const*, ...)'
collect2: ld returned 1 exit status