Compiling

從 apue 編譯程式碼

  • March 9, 2019

剛才我開始閱讀這本書: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 的文件。

引用自:https://unix.stackexchange.com/questions/105483