首页 > 代码库 > 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源码编译及问题解决