Linux環境編譯動態庫和靜態庫總結


對Linux環境動態庫和靜態庫的一些基礎知識做一些總結,

首先總結靜態庫的編譯步驟。

1 先基於.cpp或者.c文件生成對應的.o文件

2將幾個.o文件 使用ar -cr命令 生成libname.a文件

libname.a 為靜態庫, name 為靜態庫的名字,

可以根據模塊功能命名。

 

舉個例子

在當前目錄下,有一個mymethod.h文件

 

在mymethod.cpp里實現這兩個函數

 

在當前目錄下有一個main.cpp文件

 

為了方便使用,將mymethod.cpp封裝成靜態庫和動態庫

首先將mymethod.cpp 編譯成目標文件

 g++ -c mymethod.cpp -o mymethod.o

然后根據目標文件生成靜態庫

 

ar -cr libmymethod.a mymethod.o

ar命令可以用來創建、修改庫,也可以從庫中提出單個模塊

-c 選項表示 創建一個庫。不管庫是否存在,都將創建

-r 選項表示 將模塊插入庫,如果庫中有對應的模塊,那么進行更新

如果把多個.o文件插入庫.a里,只需要在后面用空格分開寫出來

格式

ar -cr 靜態庫libname.a  name1.o name2.o

靜態庫的命名有規則,格式為lib+庫名+.a

生成靜態庫libmymethod.a后,

編譯main.cpp 連接靜態庫生成可執行文件main

 g++ main.cpp -o main -I ./ -L ./ -lmymethod

-I選項表示頭文件路徑

-L表示靜態庫或者動態庫的路徑

鏈接靜態庫寫成 -l庫名即可:-lmymethod

運行./main 可以輸出結果

 

下面是動態庫的編譯

動態庫的命名是lib+庫名+.so

 

動態庫需要使用-shared 選項以及-fPIC選項

g++ -c  -fPIC mymethod.cpp -o mymethod.o

-fPIC表示代碼是和地址無關的,不需要被不同模塊重定位

然后根據目標文件生成動態庫.so文件

g++ -shared -o libmymethodso.so mymethod.o

-shared 選項表示生成的是.so動態庫文件

下一步是鏈接動態庫

 g++ main.cpp -o main -I ./ -L ./ -lmymethodso

此時不能直接運行./main否則會提示找不到對應的動態庫

上面的步驟可以直接寫成一句話

g++ -shared -fPIC mymethod.cpp -o libmymethodso.so

 

我們現在有幾種方式配置動態庫的路徑

第一種

export LD_LIBRARY_PATH="./:$LD_LIBRARY_PATH"

這種方式將動態庫路徑配置到LD_LIBRARY_PATH,只是暫時生效

第二種

使用 ldconfig 機制(需 root 權限):
● 首先,在 /etc/ld.so.conf.d/ 下創建一個 .conf 文件,
如 libmymethod.conf ,內容為共享庫所在目錄的絕對路徑
● 然后,運行 ldconfig

 

第一種比較簡單,配置好后可以直接運行./main

第二種按照操作進入/etc/ld.so.conf.d/,

然后創建mymethod.conf

 

用vi打開mymethod.conf,添加動態庫的絕對路徑

/home/secondtonone/soando

最后運行ldconfig, 即可生效了。

這樣就可以運行./main

 

現在對動態庫路徑配置做一個總結

 

解決共享庫路徑問題
 gcc/g++ 編譯期 :
● 使用 ­L 選項指定所需鏈接的共享庫所在目錄(如果共享庫或其連
接文件位於 /usr/lib 、 /usr/local/lib 或由 LD_LIBRARY_PATH 指定
的目錄下,則不需指定該選項)
● 使用 ­l 選項指定所需鏈接的共享庫名稱(無前綴、后綴)
 程序運行期:
● 使用 LD_LIBRARY_PATH 環境變量來指定所需引用的共享庫所在
目錄 ( 臨時指定或永久性寫入相關文件,普遍適用於 UNIX 世界 )
● 使用 ldconfig 機制(需 root 權限):
● 首先,在 /etc/ld.so.conf.d/ 下創建一個 .conf 文件,
如 libmymethod.conf ,內容為共享庫所在目錄的絕對路徑
● 然后,運行 ldconfig

 

我的公眾號,謝謝關注下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM