作者james732 (好人超)
看板C_and_CPP
標題Re: [問題] 環境設定
時間Mon Apr 18 05:13:37 2011
其實重點就是這三個:
(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++ 的設定就是這樣:
http://ppt.cc/o2hs
這樣 compiler 與 linker 就會各自的找到自己需要的檔案,順利生出執行檔了
(VC++的「建置」就是自動包括了 compiler 與 linker 的工作)
這算是很簡略的說明了,如果想要知道得更詳細,可以看這本書:
《程式設計師的自我修養》
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.171.46
※ 編輯: james732 來自: 140.117.171.46 (04/18 05:21)
推 issuemylove:萬分感謝超哥的回應QQ 受教了 04/18 05:49
推 issuemylove:解除了我心中的疑惑QQ 非常感謝! 04/18 05:54
推 loveme00835:好人一枚 (  ̄ c ̄)y▂ξ 04/18 05:58
→ uranusjr:推認真優良解說 04/18 07:29
推 bbearh:推寫好多! 又有舉例 04/18 10:38
推 xatier:推好人超! 04/18 11:11
推 jackwei:推推 04/18 13:00
推 zzzONzzz:好文!! 04/18 13:48
推 annheilong:推一個!! 04/18 13:50
推 attomahawk:推一個。 04/18 14:07
→ angleevil:之前在精華區看到gnu的link,這個應算是windows. 04/18 14:46
推 VictorTom:真不愧是好人:D 04/18 20:37
推 firejox:推好人!! 04/18 20:48
推 xshaddockx:超哥人超好!! 04/18 22:01
推 awashharp:好棒的解說~推的那本書個人沒什麼基礎倒是看得很痛苦 04/19 00:25
推 xxxx9659:讚! 04/19 03:22
推 joy0520:好文推! 04/19 10:59
推 flashphp:推好人 04/19 11:19
推 genghiskii:支持 04/19 22:08
推 arrenwu:寫得太棒了! 04/19 23:40
推 bil193:《C++ how to program》前幾章也有講 04/20 11:21
→ yoco315:不給卡不行啦 04/20 11:33
→ yoco315:你是一個好人! 04/20 11:33
推 tomap41017:好人超 04/20 15:44
推 pailiang:好文推 04/20 16:46
推 realtemper:感謝分享! 04/21 00:40
推 v86861062: 棒棒:D 02/19 11:36
推 henry8168: 淺顯易懂QAQQQ 07/16 18:55