→ cuteclare:-Iyour/include 04/21 17:55
: 所以我現在步驟到底是要如何???
假設你 abc.h 放在 /path/to/abc/headers
abc.c 放在 /path/to/abc/sources
然後 main.c 放在 /path/to/myproject
那麼
cd /path/to/myproject
gcc -Wall -c /path/to/abc/sources/abc.c -I/path/to/abc/headers -o abc.o
gcc -Wall -c main.c -I/path/to/abc/headers -o main.o
gcc -Wall main.o abc.o -lm -o final_product
-lm 是連結到 libm.a 的便捷寫法
另外, 如果你會常常用到 abc, 那麼把它包成一個 lib 會是個好做法
這樣就不用每次都重新編譯, 連結時的寫法也會比較簡單
cd /path/to/abc/sources
gcc -c abc.c -I../headers -o abc.o
ar rcs ../lib/libabc.a abc.o
註1 其實只有一個源碼檔的時候不需要用到 ar, 直接輸出就好了
這邊這樣做只是讓你知道如果一個 lib 要包括很多 .o 檔時要如何做
註2 Library 的命名規則是 lib[名稱].a, 這樣才能配合 -l 參數來用
包好後以後你只要
cd /path/to/myproject
gcc -Wall main.c -I/path/to/abc/headers -o main.o
gcc -Wall main.o -L/path/to/abc/libs -lm -labc -o final_product
就行了
如果你的 lib 包含很多東西, 這樣會快很多
=====
看到你前面的推文, 再補充一下
GCC 會自動搜尋一些內建路徑, 所以有些東西不用特別指明它就找得到
一般而言 math.h 會自動被搜到
所以你寫 abc 的時候不需要寫死 math.h 的位置, 編譯時也不用特別標明
但是例如你自己的 abc.h 當然它就不可能那麼厲害自己去找到
所以就要在編譯時特別用 -I 加進來
連結時也是同樣的道理
內建的函式庫如 libm.a 會自己被找到, 所以直接 -lm 就進來了
但是 libabc.a 就要自己用 -L 帶入路徑, 否則 -labc 時 gcc 根本不會知道它在哪
--
Les grandes et les meilleurs tone from "Zadok the Priest"
Eine grosse stattliche Veranstaltung by F. Handel
THE MAIN EVENT! These are the men
Sie sind die Besten
"Champions League" by Tony Britten THESE ARE THE CHAMPIONS!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.243.44.239
※ 編輯: uranusjr 來自: 111.243.44.239 (04/22 11:50)
推 onlywig:成功了 大推 也很抱歉我資值駑鈍 要你step by step才能解 04/22 11:59
→ onlywig:決 謝謝你喔 我也會繼續在這領域繼續耕耘的 04/22 12:00
→ uranusjr:其實我覺得這不是資質的問題, 純粹是沒學過就不可能會 04/22 12:01
→ uranusjr:這種東西本來就是這樣, 我也是搞很久才搞通的 :q 04/22 12:02
→ onlywig:但無私的分享值得推崇 謝囉~! 04/22 12:06
推 Bencrie:archive 檔不是直接當 object 直接餵嗎 XD 04/22 12:28
→ Bencrie:-labc 不會被當成 shared object 喔? @@a 04/22 12:29
推 bleph:感謝分享 04/22 20:47
推 yuanyu90221:感謝分享 04/24 00:23
推 lazyE:感謝分享 03/19 23:29