首页 > 代码库 > APUE源码编译及问题解决

APUE源码编译及问题解决

首先阅读readme文件,要求

To build the source, edit the Make.defines.* file for your system and set WKDIR to the pathname of the tree containing the source code.  Then just run "make".

我的系统环境是Linux的,因此修改.linux的文件.将WDIR修改为源码所在的绝对文件路径.(最好是中文目录下)

然后执行make.....命令,此时会出现一些问题.

解决方法如下:

一.提示status的问题

解决办法:

apue官方的源码有问题。标准库文件没有问题。

出现这个问题的原因是在timex.h出现了status的定义:

  int status; /* clock command/status */

而文件apue.2e/ipp/ipp.h中有宏定义:

#define status u.st

这样编译的时候就出问题了,如编译提示:

expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘.’ token

解决方法是把ipp.h文件里的status改成其他名称,比如Status,再次编译,错误提示status神马的信息,找到status出错的位置,把它改为Status就行了。

此处我的status出错位置在printd.c中:

i = ntohs(hp->status);修改为Status即可

再次make就好了。

二.提示ARG_MAX参数未定义.

由于我只是想运行一些样例,所以可以肆意的进行修改,因为目前而言,并不用到这个参数,所以先改正,编译成功再说.

Solution:解决办法

apue.2e/include/apue.h中添加一行:

#define ARG_MAX 4096

打开apue.2e/threadctl/getenv1.c,添加一行:

#include "apue.h"

再运行make, 编译通过。

我们可以看到作者在APUE的头文件中加入了 ARG_MAX的定义,并在出错的文件中添加引用该头文件。由于我没有将apue.h这个文件添加进系统头文件夹中,所以我要将添加的#include "apue.h"这行,改为  #include "../include/apue.h"


使用APUE进行单个文件的编译时,可以将apue.h复制到/usr/include下,将编译生成的在apue.2e/lib/libapue.a复制到/usr/lib下,这样引用apue.h头文件时就可以#include "apue.h",写MAKEFILE时,将libapue.a复制到和makefile文件同文件夹下,定义变量LIBS=./libapue.a,就可以方便使用。libapue.a和apue.h放在c文件目录下会比较好

makefile文件:

CC = gcc -O2
LIBS = 	./libapue.a	

.PHONY:	all clean 

all: pl1-1 pl1-2 
pl1-1:pl1-1.o 
	$(CC)  -o $@ pl1-1.o  $(LIBS)
pl1-2:pl1-2.o
	$(CC)  -o $@ pl1-2.o $(LIBS)
clean:
	rm  -f *.o



APUE源码编译及问题解决