Linux下C 程式常用編譯命令

2021-09-30 06:07:27 字數 3949 閱讀 1323

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語言陷井和缺陷 自由源於...