2010-9-4
kagula
文中涉及的命令在
ubuntu8.04.1
中測試通過,本文的目的是為了以後要用的時候,只要看一下本文就馬上能回憶起這此命令怎麼用。
生成目標檔案
#gcc–c
可以有多個
cpp檔案
編譯靜態庫
#arcr
可以有多個
o檔案(目標檔案)
靜態庫名的命名方式應該是
lib***.a
其中***
是庫的名字。
編譯成動態庫
#gcc-shared -fpci -o
libmyhello.so hello.o
可以有多個
o檔案,若考慮到同個庫有多個版本,參考如下命令
#gcc-shared -wl,-soname
,libhello.so.1
-o libhello.so.1.0 hello.o
另外再建立兩個符號連線:
#ln-s
libhello.so.1.0 libhello.so.1
#ln
-s libhello.so.1 libhello.so
這樣乙個
libhello
的動態連線庫就生成了。最重要的是傳
gcc -shared
引數使其生成是動態庫而不是普通執行程式。
-wl
表示後面的引數也就是
-soname,libhello.so.1
直接傳給聯結器
ld進行處理。實際上,每乙個庫都有乙個
soname
,當聯結器發現它正
在查詢的程式庫中有這樣乙個名稱,聯結器便會將
soname
嵌入鏈結中的二進位制檔案內,而不是它正在執行的實際檔名,在程式執行期間,程式會查詢擁有
soname
名字的檔案,而不是庫的檔名,換句話說,
soname
是庫的區分標誌。
這樣做的目的主要是允許系統中多個版本的庫檔案共存,習慣上在命名庫檔案的時候通常與
soname
相同lib***x.so.major.minor
其中,***x
是庫的名字,
major
是主版本號,
minor
是次版本號
使用靜態庫
#gcc–o
<
輸出檔名
>
<
目標檔名
>
<
靜態庫檔名
>
使用動態庫
#gcc
<
源檔名
>
-l<
動態庫檔名
>
-l<
動態庫所在路徑
>
例如:#gcctest.c -lhello -l.
把源test.c
編譯為a.out
可執行檔案,
test.c
所需要的函式在
libhello.so
檔案中定義,
libhello.so
檔案在當前目錄。
直接執行
a.out
提示找不到動態庫檔案,這時需要修改當前的動態庫搜尋路徑。
如下:#export
ld_library_path=.:$ld_library_path
再執行a.out
,測試檔案執行成功。
常用命令
[1]
檢視當前檔案依賴於哪些庫
#ldd
<
庫檔案或可執行檔案
>
[2]
檢視檔案型別
#file
<
可執行檔名
>
[3]
檢視庫中符號
#nm<
庫檔名稱
> nm
列出的符號有很多,常見的有
三種,一種是在庫中被呼叫,但並沒有在庫中定義
(表明需要其他庫支援),用
u表示;一種是庫中定義的函式,用
t表示,這是最常見的;另外一種是所謂的「弱
態」符號,它們雖然在庫中被定義,但是可能被其他庫中的同名符號覆蓋,用
w表示。
通常和grep
命令配合使用
可執行程式在執行的時候如何定位共享庫檔案
採用以下順序[搜尋
elf檔案的
dt_rpath
段]=> [
環境變數
ld_library_path]=>
[/etc/ld.so.cache
檔案列表
]=>
[/lib/,/usr/lib
目錄]
如何讓執行程式順利找到動態庫
[
方法一
]把庫檔案
copy
到/usr/lib
目錄或/lib
目錄。[
方法二
]修改當前終端的
ld_library_path
環境變數,例如:
#exportld_library_path=$ld_library_path:
/home/whereismyliblocation
此方法只能臨時改變搜尋路徑
[
方法三
]修改
/etc/ld.so.conf
檔案,把庫所在的路徑加到檔案末尾,並執行
ldconfig
重新整理。這樣,加入的目錄下的所有庫檔案都可見。
常用引數(速記)
-i<
標頭檔案路徑
>
-l<
庫檔案路徑
>-i
<
標頭檔案》
-l<
庫檔名
>
-wall
盡可能多的警告資訊
-o 輸出可執行檔名(起到重新命名輸出檔名的作用)
比如說用
gcc編譯
c++檔案需要加上
-lstdc++
引數,讓編譯器去找
libstdc++.a
靜態庫檔案。
linux下用命令編譯 除錯C 程式
先安裝gcc sudo apt get install gcc寫乙個c 的程式,然後用下面的命令編譯 g test.cpp g當然你要找到你寫的那個cpp檔案的路徑。編譯後會產生乙個檔案 a.out,這就是編譯後的結果。在window中,這個檔案是a.exe。這個檔名也可以自己手動指定,如 g te...
Linux下c mysql程式的編譯命令
最好用 gcc o test test.c mysql config cflags libs 其它的編譯命令 gcc o test test.c i usr include mysql l usr lib mysql lmysqlclient lz lm gcc o test test.c i us...
linux命令編譯C語言程式
bcpl newb c unix linux gcc c語言專門編寫作業系統的語言,所以天生適合對硬體程式設計,也以執行速度快著稱,也非常適合實現資料結構和演算法。由於出現時間過早,有很多缺陷,也沒想普通人會使用c語言程式設計,因此存在著些陷井,但前輩總結了一些避免的經驗 c語言陷井和缺陷 自由源於...