top of page

重點就是這三個:

(1) 要去哪裡找 library 的 header file

(2) 要去哪裡找 library 的 source code (原始碼)

(3) 要去哪裡找 library 的 binary code (編譯後的machine code)

 

上面的 (2) 跟 (3) 只要有其中一項就可以了

因為 (3) 可以由 (2) 產生

 

以下是說故事時間:

如果小明寫了一個函式叫 add,它的動作是把傳進來的兩個數相加

==== add.c ====

 

int add(int num1, int num2)

{

     return num1 + num2;

}

 

==== add.c ====

小明想要把這個程式碼分享給其他人使用,基本上會這麼做:

把 add.c 先編譯成 object file:add.o 之後,分享出 add.o 這個檔案

這樣想使用 add 這個函式的人,就不必再自己編譯一次了

要知道編譯程式是很花時間的

 

現在,有個人 james 想使用小明寫的這個 add 函式,因此他這麼寫:

==== main.c ====

 

#include <stdio.h>

int main()

{

     printf("%d\n", add(1, 2));

}

 

==== main.c ====

 

但 james 試著編譯這個 main.c,卻發現 compiler 跟他抱怨:

錯誤 1 error C3861: 'add': 找不到識別項

不像 if, for這些關鍵字,add並不是C語言的一部份,Compiler不認識它

你必須要告訴 compiler

這個 add 長什麼樣子:

 

==== main.c ====

 

#include <stdio.h>

int add(int num1, int num2);

int main()

{

     printf("%d\n", add(1, 2));

}

 

==== main.c ====

這樣 compiler 就不會抱怨了 但現在換 james 要抱怨:

 

使用一個 add ,只要加一行也就算了 如果像 opencv 那樣有上百個函式,

難不成要每個函式都要一行一行寫?

 

因此就有了 header file 這個聰明的東西:

==== add.h ====

 

int add(int num1, int num2); // 這個東西叫做函式宣告(declaration)

 

==== add.h ====

這樣 james 的 main.c 只要這樣寫:

==== main.c ====

 

#include <stdio.h>

#include "add.h"

int main()

{

     printf("%d\n", add(1, 2));

}

 

==== main.c ====

即使後來 library 擴充,多了 float 版的 add, double 版的 add... 等等

只要把這些新函式的宣告放進 add.h 裡,james就可以拿來用了

 

因此,要使用別人的函式,

第一件事是告訴 compiler: 包含這些函式宣告的 header file 在哪裡?

 

故事還沒結束。 main.c 順利通過編譯,變成了 main.o 檔

 

但是 main.o 裡面並沒有 add 這個函式的具體程式碼

要知道 add.h 只有這樣 int add(int num1, int num2);

 

但是真正做事情的程式碼是  →  ↓

int add(int num1, int num2)      

{                                            

     return num1 + num2;        

}

 

紅字的部份叫做函式定義(definition),上面說到,

這個部份是寫在 add.c 檔裡面

而 add.c 已經由小明編譯成 add.o 檔了

現在 james 手上有了 main.o 與 add.o 兩個檔案

要結合在一起變成 add.exe 才能執行,這個結合就是 linker 的工作

你必須要告訴 linker:要去哪裡才能找到 add.o 這個檔案

重新整理所有流程是這樣的:

james在小明的網站下載了 add.zip 檔案,解壓縮之後得到 C:\ add\ header\ add.h lib\ add.o

當 james 寫了 main.c 之後,他必須要設定

(1) header file 在 C:\add\header 這個目錄底下

(2) object file 在 C:\add\lib 這個目錄底下 在 VC++ 的設定就是這樣

這樣 compiler 與 linker 就會各自的找到自己需要的檔案,

順利生出執行檔了

(VC++的「建置」就是自動包括了 compiler 與 linker 的工作)

這算是很簡略的說明了,如果想要知道得更詳細,

可以看這本書: 《程式設計師的自我修養》

ADDRESS

桃園銘傳大學

Tel: 123-456-7890

TEL HOURS

Mon-Fri: 7am-10pm

Saturday: 8am-10pm

Sunday: 8am-11pm

FACEBOOK ME:

周冠宇
  • Facebook Metallic
  • Twitter Metallic
  • Google Metallic

© 2023 by GROOMSMAN Proudly created with Wix.com

bottom of page