APUE.3e 安装(基于ubuntu12.0.4)(转自涛哥)

本菜刚刚学习UNIX下高级编程,无奈搭建本书编程环境时遇到不少问题。幸好网上有各种大神的解决办法让我最终解决了问题。在这里感谢为LINUX开源操作系统奋斗的大神。

不过话说回来,网上大都是针对UNIX高级编程第二版的头文件搭建,现在对于第三版来说,有些过时,因为很对针对linux的make文件已经改变了很多。

话不多说,下面就来看看具体的搭建过程:(本人用的操作系统是ubuntu 14.04LTS)

1.在网上下载书中源代码,http://www.apuebook.com/

2.解压文件:tar -zxvf *.tar.gz

3.cd apue.3e/

4.make

在这个过程中,你会看到最后由于can,t find -lbsd而不能make成功,解决办法是添加libbsd.a的静态链接库  

       sudo apt-get install libbsd-dev  


5.make(again)

 

6.在编译成功的基础上,我们进行安装apue.h文件及其对应的静态链接库libapue.a

 

      sudo cp ./include/apue.h /usr/include/
      sudo cp ./lib/libapue.a /usr/local/lib/
为什么要将libapue.a移到/usr/local/lib中呢?原因是libapue.a是apue.h头文件中包含的所有函数及宏定义的具体实现,是一个静态链接库。

 

查看ld.conf.d/libc.conf你会发现gcc在搜索链接库的时候默认会去搜索/usr/local/lib/中的文件,所以我们将其放在这里,一劳永逸。。。。(不过自己要知道哦)

7.以上环境搭建成功了,下面是测试。

8.gcc 1-3.c -o 1-3 -lapue  (libapue.a在这里要写成apue,具体的gcc使用规则可以man一下,呵呵)

9.看见1-3执行程序了吧,赶紧执行一下

             ./1-3 .

 

10.最后说一下本例1-3就是书上的第一个程序---ls程序。




补充:

这样,编译的时候可以找到apue.h头文件了,但是依然会报错:

对'err_sys'未定义引用

解决方法:(转自:http://blog.csdn.net/blitzskies/article/details/42171089)

下面就是对第三版书中1-3的编译问题了。我的apue.3e源码放在/home/*/下(*是我自己的名称),那么同样在/home/*/下,我新建了一个workspace文件夹用于存放书中的示例代码文件。接下来,创建1_3.c文件,将代码输入。gcc 1_3.c。
我这个菜鸟也知道显然会有问题,首先,系统哪里知道你这个#include "apue.h"放在哪里?于是我把它改成了#include "../apue.3e/inlcude/apue.h"(../代表当前路径的前一目录),沾沾自喜的以为解决了一个大问题,gcc编译还是出错,这个错误是这样的:
# gcc 1_3.c 
/tmp/cchudidN.o: In function `main': 
1_3.c:(.text+0x20): undefined reference to `err_quit' 
1_3.c:(.text+0x5b): undefined reference to `err_sys' 
collect2: ld returned 1 exit status
哪里出错了呢?从.o这个文件后缀来看,是链接时候出了问题,那么,我们首先分解步骤来看“gcc 1_3.c”这个命令的执行过程。
gcc过程(也就是我们常说的编译过程)分为四步:preprocessing, compilation, assemble, linking,也就是常说的预处理,编译,汇编,链接4个阶段。既然是这四个阶段,那么一步步来看看输出文件是什么呗。
gcc -E test.c -o test.i //预处理,gcc的-E选项可以让预处理停止,输出结果;
gcc -S test.i -o test.s //编译,输出的汇编代码,可打开看一看,很简洁啊!-S是在编译后让gcc停止;
gcc -c test.s -o test.o //汇编,那就是二进制文件啦;
gcc test.o -o test //最后一步,链接,输出执行文件。
这个过程当然会出错,但只是在第四部链接阶段出错。为什么会出错?下面先来看看出错时候,gcc发生了什么情况吧。
(我找到了一个perfect的网站!只能用perfect来形容!GCC and Make Compiling, linking and building C/C++ applications.自己看吧:http://www.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html)
当compiling一个程序的时候,compiler需要#include里面的东西来完成编译,linker需要其它libraries里面的Object files来完成linking。对于一个新加进来的程序,系统显然不愿意自动给你找,比如说#include "apue.h",那就需要你自己告诉它apue.h在哪里了。那么就需要设置gcc的environment variables。具体如下:
PATH: For searching the executables and run-time shared libraries (.dll, .so).

CPATH: For searching the include-paths for headers. It is searched after paths specified in -I<dir> options. C_INCLUDE_PATH and CPLUS_INCLUDE_PATH can be used to specify C and C++ headers if the particular language was indicated in pre-processing. 

LIBRARY_PATH: For searching library-paths for link libraries. It is searched after paths specified in -L<dir> options.
CPATH是系统自动查找你程序中#include "*.h"头文件的地方,LIBRARY_PATH是系统自动查找链接时候libraries的地方。你可以通过如下类似的命令查看这几个地方:echo $CPATH。
之前提到的解决办法之一就是上面的道理(http://unix.stackexchange.com/questions/105483/compiling-code-from-apue):
它用如下命令:
gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue
手动指定了到哪里找include,到哪里找lib,这样可行,链接不会发生错误,但是那么复杂的语句,显然不是我想要的。那么接着指定系统查找路径,就不用输那么多命令啦。
输入$cpp -v可以查看在#include “”或者#include <>的时候系统到底自动找了哪些地方,显然它自动寻找的地方不符合你的要求。那么,我们需要的是:How to add a default include path for gcc in Linux?(http://stackoverflow.com/questions/558803/how-to-add-a-default-include-path-for-gcc-in-linux)
答案在下面,关于设置environment variables:http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html。
我们给系统添加自动查找的路径,那么输入以下命令:
$ C_INCLUDE_PATH=/home/*/apue.3e/include //*是我的Ubuntu用户名
$ export C_INCLUDE_PATH //作用是使其生效
$ LIBRARY_PATH=/home/*/apue.3e/lib
$ export LIBRARY_PATH
那么输入 echo $C_INCLUDE_PATH和echo $LIBRARY_PATH来看一下吧!
接下来,1_3示例程序中的#include "apue.h"不用改,直接使用命令:$gcc 1_3.c -lapue即可编译成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值