Re: [問題] 環境設定

看板C_and_CPP作者 (好人超)時間13年前 (2011/04/18 05:13), 編輯推噓24(2404)
留言28則, 26人參與, 最新討論串2/2 (看更多)
其實重點就是這三個: (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)

04/18 05:49, , 1F
萬分感謝超哥的回應QQ 受教了
04/18 05:49, 1F

04/18 05:54, , 2F
解除了我心中的疑惑QQ 非常感謝!
04/18 05:54, 2F

04/18 05:58, , 3F
好人一枚 (  ̄ c ̄)y▂ξ
04/18 05:58, 3F

04/18 07:29, , 4F
推認真優良解說
04/18 07:29, 4F

04/18 10:38, , 5F
推寫好多! 又有舉例
04/18 10:38, 5F

04/18 11:11, , 6F
推好人超!
04/18 11:11, 6F

04/18 13:00, , 7F
推推
04/18 13:00, 7F

04/18 13:48, , 8F
好文!!
04/18 13:48, 8F

04/18 13:50, , 9F
推一個!!
04/18 13:50, 9F

04/18 14:07, , 10F
推一個。
04/18 14:07, 10F

04/18 14:46, , 11F
之前在精華區看到gnu的link,這個應算是windows.
04/18 14:46, 11F

04/18 20:37, , 12F
真不愧是好人:D
04/18 20:37, 12F

04/18 20:48, , 13F
推好人!!
04/18 20:48, 13F

04/18 22:01, , 14F
超哥人超好!!
04/18 22:01, 14F

04/19 00:25, , 15F
好棒的解說~推的那本書個人沒什麼基礎倒是看得很痛苦
04/19 00:25, 15F

04/19 03:22, , 16F
讚!
04/19 03:22, 16F

04/19 10:59, , 17F
好文推!
04/19 10:59, 17F

04/19 11:19, , 18F
推好人
04/19 11:19, 18F

04/19 22:08, , 19F
支持
04/19 22:08, 19F

04/19 23:40, , 20F
寫得太棒了!
04/19 23:40, 20F

04/20 11:21, , 21F
《C++ how to program》前幾章也有講
04/20 11:21, 21F

04/20 11:33, , 22F
不給卡不行啦
04/20 11:33, 22F

04/20 11:33, , 23F
你是一個好人!
04/20 11:33, 23F

04/20 15:44, , 24F
好人超
04/20 15:44, 24F

04/20 16:46, , 25F
好文推
04/20 16:46, 25F

04/21 00:40, , 26F
感謝分享!
04/21 00:40, 26F

02/19 11:36, , 27F
棒棒:D
02/19 11:36, 27F

07/16 18:55, , 28F
淺顯易懂QAQQQ
07/16 18:55, 28F
文章代碼(AID): #1DgrW4a5 (C_and_CPP)
文章代碼(AID): #1DgrW4a5 (C_and_CPP)