靜態庫與動態庫_筆記

參考文章:

Linux編譯多個不同目錄下的文件以及靜態庫、動態庫的使用

http://blog.csdn.net/luotuo44/article/details/16970841

linux 動態庫 靜態庫原理分析

https://blog.csdn.net/li_wen01/article/details/88979118

 

文件佈局如下:

1、編譯靜態庫

在function目錄下,執行命令 $g++ -c sub.cpp add.cpp 生成sub.o和add.o文件,然後打包生成靜態庫,即.a文件

$ar -cr libhead.a add.o sub.o
-c :  代表create,創建.a文件
-r :  代表replace

注意:

1) 命令中,.a文件要放在.o文件的前面

2) .a文件的格式: 以lib爲前綴,.a爲後綴,例如 libhead.a

可以使用 $ar -t libhead.a 查看libhead.a文件中包含哪些目標文件,執行結果爲 add.o  sub.o

 

輸入命令生成可執行文件:

$g++ main.cpp -Ifunction -Lfunction -lhead -o main

-I( 大寫i ) 頭文件位置

-L 靜態庫目錄

-l( 小寫L ) 靜態庫

 

2、動態庫

$g++ -c -fPIC add.cpp sub.cpp 生成位置無關的目標文件

$g++ -shared -fPIC add.o sub.o -o libhead.so 生成.so動態庫

$g++ -Ifunction -Lfunction -lhead main.cpp -o main 利用動態庫生成可執行文件

 

當靜態庫和動態庫同時存在時,系統優先使用動態庫

 

ldd命令:查看可執行程序依賴哪些庫

nm命令:查看庫中有哪些函數

動態庫的路徑問題

爲了讓執行程序順利的找到動態庫,有三種方法: 
(1) 把庫拷貝到/usr/lib和/lib目錄下。 
(2) 在LD_LIBRARY_PATH環境變量中加上庫所在路徑。 
(3) 添加/etc/ld.so.conf.d/*.conf文件,把庫所在路徑加到文件末尾,並執行ldconfig刷新。 
這樣,加入的目錄下的所有庫都可見。

4)編譯指定動態庫位置(注意不再使用-L和-l)

$g++ -Ifunction ./libhead.so main.cpp -o main

或者,使用選項-Wl,-rpath,XXXX.其中XXXX表示路徑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章