Linux下配置APUE的編譯 報錯以後如何處理

APUE即Unix環境高級編程,本書中幾乎全部的程序都包含一個apue.h的頭文件,那如何配置這個apue.h呢?html

官方地址:http://www.apuebook.com/apue3e.htmllinux

一、咱們能夠在src.3e.tar中下載,而後放到你的Linux桌面上(沒桌面的,隨意放吧)編程

二、解壓下載的文件:ubuntu

tar -zxvf src.3e.tar.gz

三、進入解壓後的目錄:centos

cd apue.3e/

四、編譯:socket

make

 

如下是我用centos 32 6.5   make 最新版第三版的錯誤:async

[u1@h1 apue.3e]$ make
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o rwlock.o rwlock.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  timedlock.c -o timedlock  -L../lib -lapue -pthread -lrt -lbsd
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  barrier.c -o barrier  -L../lib -lapue -pthread -lrt -lbsd
/tmp/ccb9gvom.o: In function `thr_fn’:
barrier.c:(.text+0x6e): undefined reference to `heapsort’
collect2: ld 返回 1
make[1]: *** [barrier] 錯誤 1
make[1]: Leaving directory `/home/albert/Documents/progs/apue.3e/threads’
make: *** [all] 錯誤 1
[u1@h1 apue.3e]$
解決的方法:
1)ubuntu
sudo apt-get install libbsd-dev
2) fedora, redhat, centos
2.1) 下載兩個包
2.1a) i386
wget ftp://ftp.univie.ac.at/systems/linux/fedora/epel/6/i386/libbsd-0.6.0-1.el6.i686.rpm
wget ftp://ftp.univie.ac.at/systems/linux/fedora/epel/6/i386/libbsd-devel-0.6.0-1.el6.i686.rpm
2.1b) x86_64
wget ftp://ftp.univie.ac.at/systems/linux/fedora/epel/6/x86_64/libbsd-0.6.0-1.el6.x86_64.rpm
wget ftp://ftp.univie.ac.at/systems/linux/fedora/epel/6/x86_64/libbsd-devel-0.6.0-1.el6.x86_64.rpm函數

2.2)安裝如上包,注意命令順序,須要root權限
2.2a) i386
yum install libbsd-0.6.0-1.el6.i686.rpm
yum install libbsd-devel-0.6.0-1.el6.i686.rpm
2.2b) x86_64
yum install libbsd-0.6.0-1.el6.x86_64.rpm
yum install libbsd-devel-0.6.0-1.el6.x86_64.rpm2.3)而後繼續編譯apue
[u1@h1 apue.3e]$make
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o asyncsocket.o asyncsocket.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o openmax.o openmax.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o sleep.o sleep.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o sleepus_poll.o sleepus_poll.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o sleepus_select.o sleepus_select.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  getpwsvr4.c -o getpwsvr4  -L../lib -lapue -pthread
make[1]: Leaving directory `/home/u1/Documents/progs/apue.3e/exercises’
[[u1@h1 apue.3e]$$spa

此時應該成功了,咱們把apue.h 與 libapue.a 放入到對應的目錄中,用以下命令完成:code

 cp ./include/apue.h /usr/include/
 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/中的文件,因此咱們將其放在這裏,一勞永逸。。。。(不過本身要知道哦)

相關文章
相關標籤/搜索