標籤:
控制台下的編譯:
(實際蘋果用的clang,將gcc換成clang也是一樣的效果)
gcc [options] <inputs>
option常用的有
-o 連結
-c 將.c源檔案編譯成.o目標檔案,不進行連結
gcc helloworld.c -c
將產生helloworld.o
需進一步輸入
gcc helloworld.o -o helloworld
來產生最終的可執行檔helloworld。
而
gcc helloworld.c -c -o <隨便一個名字>
能自訂產生的目標檔案名稱
-l(小寫L)後接xxxx 表示調用libxxxx.yy 庫
如果庫不在系統預設的目錄下要使用-L後接路徑 再接-lxxxxx
-I(大寫i)後接路徑,表示在此路徑下尋找標頭檔 xxxx.h
建立靜態連結庫:
ar -rcs libxxxx.a aaaa.o bbbb.o ccccc.o ...etc
r:如果目標檔案存在就重新整理它
c:建立後不顯示反饋資訊
s:在檔案開頭建立索引
建立動態連結程式庫:
不同作業系統的動態連結程式庫尾碼不相同
Windows裡動態連結程式庫尾碼為 .dll(Dynamic Link Library)
Linux裡尾碼為 .so
Mac裡尾碼為 .dylib
建立:(產生的動態連結程式庫尾碼跟隨系統)
gcc -shared <FileName>.o livxxxx.dylib
使用:
和靜態庫一樣
使用 nm 指令查看庫
==================================
執行個體測試
~/Desktop/codeC 下有3個檔案 main.c test.c/.h
test檔案內有一函數print_hello,作用是列印"Hello World!"
main.c中include了test.h並調用了print_hello
先將test.c/.h製成動態連結程式庫:
gcc test.c -c //此操作在目前的目錄下產生test.ogcc -shared test.o -o libhello.dylib //此操作在目前的目錄下產生lib hello.dylib
連結並產生可執行檔
gcc main.c -c //產生main.ogcc main.o -L. -lhello -o helloworld //產生helloworld
./helloworld //控制台輸出helloworld字樣
現在更改一下連結的庫:
有一對test2.c/.h檔案,裡面也有一個print_hello函數,但作用是列印"How Are You"
用該檔案產生同樣名稱的動態連結程式庫:
gcc test2.c -c //產生test2.ogcc -shared test2.o -o libhello.dylib //重建了同名動態連結程式庫
然後直接運行原來的那個helloworld程式:
./helloworld
控制台輸出了"How Are You",而不是“Hello World"了,即使main函數的代碼沒有改變也沒有重新編譯。
命令列編譯的基本指令