/tmp/ccJxsZJ1.o: In function `main':
seek_io.c:(.text+0x4a): undefined reference to `usageErr'
seek_io.c:(.text+0x86): undefined reference to `errExit'
seek_io.c:(.text+0x11d): undefined reference to `getLong'
seek_io.c:(.text+0x149): undefined reference to `errExit'
seek_io.c:(.text+0x17a): undefined reference to `errExit'
seek_io.c:(.text+0x31a): undefined reference to `errExit'
seek_io.c:(.text+0x391): undefined reference to `getLong'
seek_io.c:(.text+0x3c2): undefined reference to `errExit'
seek_io.c:(.text+0x41a): undefined reference to `cmdLineErr'
collect2: error: ld returned 1 exit status
其中ename.c.inc文件定義了一個字符串數組,用於對應錯誤碼的名稱
error_functions.h文件聲明瞭本書自定義的錯誤處理函數
get_num.h文件聲明瞭本書自定義的數值提取函數
tlpi_hdr.h文件則包含了後續需用到的系統調用頭文件
由於存在3個頭文件以及2個實現,每次編譯時必須對實現也進行編譯,爲方便後續學習,採用將頭文件複製到默認的編譯器尋找目錄下,並將實現打包成靜態庫,然後使用別名來默認鏈接靜態庫
第一步:下載本書所給的源碼文件
wget "http://man7.org/tlpi/code/download/tlpi-161214-dist.tar.gz"
或者點此下載
第二步:解壓後,make編譯
tar -zxvf tlpi-161214-dist.tar.gz
cd tlpi-dist/
make -j
第三步:拷貝頭文件至系統目錄
cd lib/
sudo cp tlpi_hdr.h /usr/local/include/
sudo cp get_num.h /usr/local/include/
sudo cp error_functions.h /usr/local/include/
sudo cp ename.c.inc /usr/local/include/
第四步:製作靜態庫文件
g++ -c get_num.c error_functions.c
ar -crv libtlpi.a get_num.o error_functions.o
sudo cp libtlpi.a /usr/local/lib
第五步:簡化編譯命令
alias gl++='new() { g++ $1 -ltlpi;}; new'
第五步需要在當前用戶的主目錄下的.bashrc文件中設置別名,由於alias不支持參數,因此需要使用函數來間接實現,並且接受一個參數$1以指定對某個源文件進行編譯並鏈接之前的靜態庫libtlpi.a。配置完畢後重新讀入.bashrc文件以生效。這裏使用函數來接受一個參數存在一個缺點即只能使用一個命令行參數,多餘參數將被忽略。
完成上面的步驟後,即可使用快捷命令來編譯我們的程序了:
gl++ xxx.c
該命令將編譯生成a.out文件