Ubuntu14.04 LTS下 <<UNIX环境高级编程>>源代码下载编译步骤
2014-11-03 00:02
751 查看
这篇文章是我在系统中编译源代码时遇到的问题的一个总结。
首先,需要下载源代码,地址为http://www.apuebook.com/。大致浏览了下,可以下载源码和查看每个版本都修改了哪些bug,上面记载了有些将要在第五版中修复的bug。开始以为国内的网无法访问此网站,后来一点,上去了。
下面就开始了编译的阶段。
将源代码下载后解压,我解压的路径为/home/eric/apuesrc/apue.2e下面,用终端定位至此,首先阅读下源码中的readme文件,在我看来有价值的信息仅是把工作目录改为自己的解压目录,然后执行make命令。如下遇到的问题皆在互联网中找到了解决方案,在此我只是做一个总结而已。
1.无法找到apue.h文件。
这个文件位于apue.2e/include下,但执行make的时候就是找不到,于是网上的解决方案是将apue.h文件拷贝到/usr/include/下即可。
2.In file included from printd.c:6:0: ipp.h:122:17: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’
before ‘.’ token
这个错误在网上搜到的是提示timex.h这个文件报错,我的系统没有报timex.h出错,但我到系统的/usr/inclue下找确实有这个文件而且其中也确实定义了
int status; /* clock command/status */
于是猜测是同一个问题,即宏定义冲突的问题。
解决方案是把apue.2e/ipp/ipp.h中宏定义status改名,比如Status,然后执行make,系统会提示status找不到了,定位到apue.2e/ipp/printd.c中第977行:
i = ntohs(hp->status);
将status改为Status即可。
3.再次编译仍然失败。
这次出现的问题是:
getenv1.c:4:20:
error: ‘ARG_MAX’ undeclared here (not in a function)
解决方案是:
在apue.2e/include/apue.h中添加一行:
#define ARG_MAX 4096
打开apue.2e/threadctl/getenv1.c 和apue.2e/threadctl/getenv3.c,添加一行:
#include "apue.h"。
到此基本完成,但还需改动两步:
1.把先前拷贝到/usr/include/目录下的apue.h中也要添加一句#define
ARG_MAX 4096(系统每次编译好像找的是系统中.h文件??????)
这时再执行make命令,编译通过。
2.将编译生成的/apue.2e/lib/libapue.a的文件拷贝到/usr/lib/下,这个在今后编译执行书中例程时会需要。
~
编译运行程序
gcc 源程序.c -o 可执行程序名 -lapue
注意
:若-lapue 写在了源程序的前面会出现错误 eg. gcc ls1.c -o ls1 -lapue
因为
.a在链接的时候,必须放在文件之后
.so在链接的时候,对位置没有要求,前后都可以
首先,需要下载源代码,地址为http://www.apuebook.com/。大致浏览了下,可以下载源码和查看每个版本都修改了哪些bug,上面记载了有些将要在第五版中修复的bug。开始以为国内的网无法访问此网站,后来一点,上去了。
下面就开始了编译的阶段。
将源代码下载后解压,我解压的路径为/home/eric/apuesrc/apue.2e下面,用终端定位至此,首先阅读下源码中的readme文件,在我看来有价值的信息仅是把工作目录改为自己的解压目录,然后执行make命令。如下遇到的问题皆在互联网中找到了解决方案,在此我只是做一个总结而已。
1.无法找到apue.h文件。
这个文件位于apue.2e/include下,但执行make的时候就是找不到,于是网上的解决方案是将apue.h文件拷贝到/usr/include/下即可。
2.In file included from printd.c:6:0: ipp.h:122:17: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’
before ‘.’ token
这个错误在网上搜到的是提示timex.h这个文件报错,我的系统没有报timex.h出错,但我到系统的/usr/inclue下找确实有这个文件而且其中也确实定义了
int status; /* clock command/status */
于是猜测是同一个问题,即宏定义冲突的问题。
解决方案是把apue.2e/ipp/ipp.h中宏定义status改名,比如Status,然后执行make,系统会提示status找不到了,定位到apue.2e/ipp/printd.c中第977行:
i = ntohs(hp->status);
将status改为Status即可。
3.再次编译仍然失败。
这次出现的问题是:
getenv1.c:4:20:
error: ‘ARG_MAX’ undeclared here (not in a function)
解决方案是:
在apue.2e/include/apue.h中添加一行:
#define ARG_MAX 4096
打开apue.2e/threadctl/getenv1.c 和apue.2e/threadctl/getenv3.c,添加一行:
#include "apue.h"。
到此基本完成,但还需改动两步:
1.把先前拷贝到/usr/include/目录下的apue.h中也要添加一句#define
ARG_MAX 4096(系统每次编译好像找的是系统中.h文件??????)
这时再执行make命令,编译通过。
2.将编译生成的/apue.2e/lib/libapue.a的文件拷贝到/usr/lib/下,这个在今后编译执行书中例程时会需要。
~
编译运行程序
gcc 源程序.c -o 可执行程序名 -lapue
注意
:若-lapue 写在了源程序的前面会出现错误 eg. gcc ls1.c -o ls1 -lapue
因为
.a在链接的时候,必须放在文件之后
.so在链接的时候,对位置没有要求,前后都可以
相关文章推荐
- <UNIX环境高级编程>文件共享及fork函数
- <<UNIX环境高级编程>>随书代码的打开方式
- <UNIX环境高级编程>中的 "apue.h"
- 高通源代码 Ubuntu14.04下载&编译Android(1)
- Odoo8.0在Ubuntu LTS 14.04环境下的源代码编译安装
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码 2/2 分享
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码 1/2 分享
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码 2/2
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码 1/2
- Ubuntu 11.10编译android源代码2.3.1 (32位) <下载>
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码 [转]
- <UNIX环境高级编程>文件共享及fork函数
- <UNIX环境高级编程>--第七章
- <UNIX环境高级编程> 第三版 apue.h 配置问题解决方法
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码
- 从源代码编译安装Qt开发工具如(KDevelop)时遇到:Qt (>= Qt 3.3 and < 4.0)解决方法
- buntu 10.04环境下载&编译Android 源代码
- Ubuntu 10.04环境下载&编译Android-2.1_r2源代码【20110527更新说明】