Compiling
從 apue 編譯程式碼
剛才我開始閱讀這本書:UNIX® 環境中的高級程式。我想嘗試執行它的第一個程式碼範例。我正在執行 Scientific Linux 6.4。
我下載了原始碼,正如它在自述文件中所說,我
make
在未壓縮的文件中執行。我寫了第一個程序(一個模擬
ls
命令)#include "./include/apue.h" #include <dirent.h> int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; if(argc!=2) err_quit("usage: test directory_name"); if((dp=opendir(argv[1]))==NULL) err_sys("Can't open %s", argv[1]); while((dirp=readdir(dp))!=NULL) printf("%s\n", dirp->d_name); closedir(dp); return 0; }
並將其放入未壓縮的文件中。正如這本書所建議的那樣,我然後跑了:
gcc myls.c
。但我得到這個錯誤:# gcc myls.c /tmp/ccWTWS2I.o: In function `main': test.c:(.text+0x20): undefined reference to `err_quit' test.c:(.text+0x5b): undefined reference to `err_sys' collect2: ld returned 1 exit status
我想知道如何解決這個問題。我還希望能夠執行我在任何目錄中編寫的程式碼。
對如何在 UNIX® 環境中的高級程式中編寫和編譯程序的簡短回顧,感謝slm幫助我理解這些步驟。您可以從這裡下載原始碼。我希望這些資訊被包含在本書的附錄 b 中,其中解釋了標頭檔。
未壓縮的文件包含具有章節名稱的目錄以及另外兩個名為
include
和的目錄lib
。有章節名稱的,裡面有該章節的所有程序。該
include
目錄包含本書中大多數程序中使用的標頭檔:apue.h
. 該lib
目錄包含該標頭的實現的原始碼。讓我們假設未壓縮的文件位於:
SCADDRESS/
,例如它可能是:/home/yourid/Downloads/apue.3e/
解壓縮原始碼後,進入目錄並執行
make
:$ cd SCADDRESS $ make
make
將編譯所有章節中的所有程序。但重要的是,在此之前,它將生成包含apue.h
.要編譯您從書中編寫的範常式序,請執行以下 GCC 命令(假設您的程序的名稱是
myls.c
書中的第一個):gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue
-I
告訴gcc
在哪個目錄中查找包含文件。-L
告訴它庫目錄的位置,並且告訴它-lapue
要在該目錄中查找的庫文件的名稱。這樣 -LXXX 表示在庫目錄中查找名稱為:libXXX.a 或 libXXX.so 的文件。