您的位置:首页 > 其它

工作环境迁移:Ubuntu 12.04使用笔记(二)

2013-11-12 21:58 405 查看
How to compile code of APUE in Ubuntu 12.04 ?

参考链接: http://wenku.baidu.com/view/20aaccd27f1922791688e8b8.html

1.去该网站http://www.apuebook.com/下载源码 src.tar.bz 

2.解压到某目录,假定为/home/user,进入解压后的文件修改 Make.defines.linux中的WKDIR=/home/user/apue.2e 

3.返回至apue.2e/std目录下面,修改linux.mk,将里面的nawk全部改为awk,可以使用这个命令 :1,$s/nawk/awk/g  

4.make后将会遇见两个问题。 

    a)status宏主义冲突

gcc -DLINUX -ansi -I/tmp/apue.2e/include -Wall -D_GNU_SOURCE -DDEBUG  -c -o printd.oprintd.c 

 In file included from /usr/include/i386-linux-gnu/bits/time.h:86:0,                 

 from /usr/include/time.h:42,                 

 from /usr/include/pthread.h:26,                 

 from printd.c:11: 

/usr/include/i386-linux-gnu/bits/timex.h:31:7: 错误: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘.’ token  

原因: 

在apue.2e/ipp.h中定义了一个宏定义status和

/usr/include/i386-linux-gnu/bits/timex.h中的成员status冲突  

解决方法: 

修改这个apue.2e/ipp/ipp.h文件中的宏名称,例如改为Status 

然后将apue.2e/ipp/printd.c中977行的 hp->status 改为hp->Status     

b)ARG_MAX未定义

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

 #define ARG_MAX 4096 

    打开apue.2e/threadctl/getenv1.c 和apue.2e/threadctl/getenv3.c,添加一行:     #include "apue.h" 

5.解决完以上两个问题后,就可以make成功。 

6.把头文件apue.h放到/usr/include/中,注意要以root用户操作以下命令 

   cp ~/apue.2e/include/apue.h  /usr/include 

   cp ~/apue.2e/lib/libapue.a  /usr/lib/ 

7.编译时候可以使用 gcc  源程序.c -o 可执行程序名 /usr/lib/libapue.a ps,如果c++引用此头文件和静态库要使用extern "C"{include "apue.h"} 

另外: 

因为Make.defines.linux中CFLAGS加入了-ansi开关,而-ansi与-std=c89是等同的,遵循C89规范,不能够处理双斜线注释。因此恰当的解决方法是将-ansi改为-std=gnu89(注意不是c89),gnu89相当于c89加上一些gcc的扩展功能,包括双斜线注释形式。另外,注意虽然写为-std=c99也可处理双斜线注释,但因为c99标准纳入了一些C++规范,与ansi区别较大,因此不推荐。

参考:http://blog.csdn.net/jackyu613/article/details/6451057
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: