• 关于apue.3e中apue.h的使用


     
    援引https://www.cnblogs.com/qinqiao/p/how-to-compile-apue-v3-apue_h.html

    关于apue.3e中apue.h的使用

    近来要学一遍APUE第三版,并于此开博做为记录。

    先下载源文件:

    1 # url: http://http//www.apuebook.com/code3e.html
    2 curl -O  http://www.apuebook.com/src.3e.tar.gz
    3 tar -zxvf src.3e.tar.gz
    4 cd apue.3e
    5 ls

    从上面ls的结果看,其实完全看不明白这些目录与APUE书中代码的关系,或者有些目录可以猜测出是那一章。不过有个小技巧:

     ls -l figlinks/ 

    你会发现,这个目录下全是软链。通过软链正好可以对应到书上的代码。比如,书上图1-3为ls命令的简易实现,这正是:

    # fig1.3 -> ../intro/ls1.c

    先从apue.h的使用上做一说明。个人觉得有两种方式来使用,整理如下。 至于编译环境,本人使用Ubuntu 14.04 LTS。

    一次编译生成libapue.a文件,长久使用

    代码如下:

    复制代码
     1 sudo apt-get install libbsd-dev 
     2 # 用于解决make时报:can,t find -lbsd错误。 
     3 make 
     4 # 编译成功后,执行如下copy操作: 
     5 # libapue.a是apue.h文件的静态链接库 
     6 
     7 sudo cp ./include/apue.h /usr/include/ 
     8 sudo cp ./lib/libapue.a /usr/local/lib/ 
     9 
    10 # 至于为什么要放置静态文件在上述目录,是因为gcc在加载静态文件时设置的从上述目录查询,可以通过如下文件知晓。 
    11 # /etc/ld.conf.d/libc.conf 
    复制代码

    下面来测试上述配置的效果。实际上,上述make时,已经将所有c文件编译成目标文件了。可以看下各个目录下都有相应.c文件的.o文件了。

    复制代码
     1 gcc ls1.c 
     2  /tmp/ccyhkMzS.o: In function `main': 
     3  ls1.c:(.text+0x20): undefined reference to `err_quit' 
     4  ls1.c:(.text+0x5b): undefined reference to `err_sys' 
     5  collect2: error: ld returned 1 exit status 
     6 
     7 # 上述编译因为没有带apue表态库,所以gcc找不到APUE作者定义的错误处理函数,err_quit, err_sys。
     8  gcc ls1.c -lapue # 带上apue表态库 
     9 ./a.out ./ 
    10 . 
    11 testerror.c 
    12 shell2.c 
    13 hello 
    14 # ... 
    复制代码

    如上,只有每次编译时带上-lapue的参数,即可以使用部署在/usr/local/lib/下的libapue.a库。

    如果你是在Mac os X 10.11系统下编译,当copy文件到/usr/inlucde目录时,会出现Operation not permitted报错。

    因为10.11启动了SIP特性,即使使用sudo cp也会失败。要关闭SIP,需要在Recovery OS环境下执行如下命令:

    sudo csrutil disable

    每次独立编译apue.h和error.c文件

    第二种方式是每次单独编译apue,方法如下。需要先清理掉上述方法生成的编译环境:

    复制代码
     1 sudo rm -vf /usr/include/apue.h /usr/local/lib/libapue.a 
     2 make clean # 清掉之前的编译临时文件 
     3 
     4 cp include/apue.h ./ cp lib/error.c ./ vi apue.h
     5 
     6 # 在最后一行的endif预编译命令前加上一行include指令如下(包括井号):
     7 #inclulde "error.c" 
     8 
     9 cp intro/ls1.c . 
    10 gcc -o ls ls.c 
    11 ./ls ./
    12 # 编译成功,执行成功。ls1.c需要的inlucde文件都已经copy到当前目录了
    复制代码

    这种方式的好处是,每次编译时,使用了apue.h中的什么文件,直接从lib/下拷到当前目录即可,比较清楚的知道用了那些apue.h中的函数。

    不足之处是每次都需要拷贝。

  • 相关阅读:
    Configuring the JA-SIG CAS Client --官方
    源代码解读Cas实现单点登出(single sign out)功能实现原理--转
    Class loading in JBoss AS 7--官方文档
    mysql中判断字段为空
    Mysql大小写敏感的问题 --转
    LOAD DATA INFILE Syntax--官方
    MySql中把一个表的数据插入到另一个表中的实现代码--转
    splunk中mongodb作用——存用户相关数据如会话、搜索结果等
    英语中逗号作用
    splunk LB和scale(根本在于分布式扩展index,search)
  • 原文地址:https://www.cnblogs.com/wangkeqin/p/11382370.html
Copyright © 2020-2023  润新知