• 解决《UNIX环境高级编程》(APUE)示例代码的编译问题


    转自 http://cunsheng.sinaapp.com/?p=360

    APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和Mac OS X编译时都遇到了一些小问题, 以下是解决方法和其他一些提示, 希望能对其他人有用

    下载了源代码后, 正常情况下两步操作就可以完成编译

    1. 根据你的操作系统选择对应的Make.defines.*文件, 例如你使用的是Linux, 那么就选择Make.defines.linux, 打开并修改其中的第6行, 将WKDIR的值设为解压出的源码文件夹的绝对路径
    2. make

    编译时可能会出现不少warning, 但只要能一直执行到最后就算是成功, 可以echo $?看看, 如果输出0就表示成功

    Linux下的编译问题

    我的Linux发行版是CentOS release 5.4 (Final), make时报如下错误

    1
    2
    3
    4
    5
    make[2]: Entering directory `/home/cunsheng/code/apue.2e/std'
    nawk -f makeconf.awk >conf.c
    /bin/sh: nawk: command not found
    make[2]: *** [conf.c] Error 127
    make[2]: Leaving directory `/home/cunsheng/code/apue.2e/std'

    提示nawk不存在, 关于nawk与awk的异同可见这里, 解决这个问题可以简单的用awk替代nawk来解决, 可以挑PATH中的任一可寻路径(例如~/bin) ln -s建立个nawk的软链到awk, 然后一定记得make clean后再make, 否则你会遇到下面的这个问题

    1
    2
    3
    4
    5
    6
    7
    make[2]: Entering directory `/home/cunsheng/code/apue.2e/std'
    gcc -DLINUX -ansi -I/home/cunsheng/code/apue.2e/include -Wall -D_GNU_SOURCE -L../lib conf.c ../lib/libapue.a -o conf
    /usr/lib/../lib64/crt1.o: In function `_start':
    (.text+0x20): undefined reference to `main'
    collect2: ld returned 1 exit status
    make[2]: *** [conf] Error 1
    make[2]: Leaving directory `/home/cunsheng/code/apue.2e/std'

    OS X下的编译问题

    我的版本是10.8.1, Xcode版本是4.4.1, make时报如下错误

    1
    2
    3
    4
    5
    6
    gcc -ansi -I/Volumes/Cunsheng/Home/Code/apue.2e/include -Wall -DMACOS -DDEBUG -o call main.o call.o put.o take.o takeput.o escape.o loop.poll.o ../sockets/clconn.o ../lib/libapue.a
    Undefined symbols for architecture x86_64:
    "_CMSG_LEN", referenced from:
    _recv_fd in libapue.a(recvfd.o)
    ld: symbol(s) not found for architecture x86_64
    collect2: ld returned 1 exit status

    造成这个问题的原因, 从表面看是”CMSG_LEN”宏缺少了对OS X的定义, 但我猜测可能这背后还有故事, 这里就不细究了, 解决方法也很简单, 打开include/apue.h, 在第8行往后插入以下两行代码后再make clean; make即可

    1
    2
    #elif defined(MACOS)
    #define CMSG_LEN(x) _CMSG_DATA_ALIGN(sizeof(struct cmsghdr)+(x))

    关于GDB

    在实践APUE示例源码时用gdb配合当然是最好不过了, 不过你需要在cc时加上-g选项才能输出gdb调试时所需的symbols
    打开你的操作系统对应的Make.defines.*文件, 在第7行的加上-g选项就OK了

    最后提醒下, 源码的章节编号是按照英文版来的, 例如我的APUE第二版第4页的程序清单1-1, 理应对应的源码是fig1.1, 但实际却是fig1.3, 找代码时要人脑offset一下才是

    最最后, 感谢已故的Richard Stevens大神留下的这一系列好书

  • 相关阅读:
    第五天——编码进阶(三)
    vue系列---------vuejs基础学习3.0
    前端随心记---------vuejs基础学习2.2
    前端随心记---------HTML5+CSS系列5.0
    前端随心记---------Ajax
    前端随心记---------前后端验证用户名案例(php,mysql结合)
    前端随心记---------MySQL
    前端随心记---------PHP
    vue系列---------vuejs基础学习2.1
    前端随心记---------HTML5+CSS系列4.0
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/3336573.html
Copyright © 2020-2023  润新知