包含標頭檔案和庫:
-idir: 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例:gcc test.c –i../inc -o test。
-ldir : 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。
-llibrary 指定額外鏈結的lib庫
巨集定義
-dmacro 以字串"1"(預設值)定義 macro 巨集。
-dmacro=defn 以字串"defn"定義macro 巨集,注意中間不能有空格。
-umacro 取消對 macro 巨集的定義。
除錯和可執行檔案形式:
-g 指示編譯器,在編譯的時產生除錯資訊。
-ggdb 盡可能的生成gdb的可以使用的除錯資訊(比-g生成的資訊更多些)。
-static 禁止使用動態庫,編譯得到的程式會比較大,但可以自由執行。
-share 盡量使用動態庫,所以生成檔案比較小,但是需要系統由動態庫。
告警選項
-wall 產生盡可能多的警告資訊,建議始終帶上
-werror 將所有的警告當成錯誤進行處理
靜態鏈結庫:
1.通過gcc –c命令將stack.c編成stack.o
gcc -c stack.c
2.通過ar命令將stack.o封裝成libstack.a
ar cr libstack.a stack.o #多個.o打包成.a檔案
3.鏈結
gcc -o run main.c -l.(庫目錄) -lstack(庫)
庫名: libstack.a
庫:stack(去掉lib和字尾得到)
#可以合併多個.o檔案
ar cr libtest.a first.o second.o third.o
#檢視打包了哪些.o檔案
ar -t ***.a
#動態鏈結庫
1.通過gcc –c命令將stack.c編成stack.o
gcc -c stack.c
2. gcc -shared -o libstack.so stack.o
3.鏈結
gcc -o run main.c -l.(庫目錄) -lstack(庫)
gcc -o run main.c -l. -lstack
gcc -o run main.c -l. -lstack -wl,-rpath,dir1
4.指定動態鏈結庫的位址
export ld_library_path=$ld_library_path:.
5.執行
./run
#檢視需要的動態鏈結庫
ldd run
#動態鏈結庫搜尋目錄
1. 環境變數 ld_library_path
2. 從/etc/ld.so.conf找(用ldconfig重新整理快取)
3. 預設的系統路徑, 先是/lib(/lib64)然後是/usr/lib (/usr/lib64)
4. 還可以編譯時指定搜尋路徑
-wl,-rpath,dir1:dir2:...:dirn (多個冒號間隔)
#ldconfig -v | grep b.so
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...
靜態鏈結庫,動態鏈結庫
關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...
靜態鏈結庫和動態鏈結庫
其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...