對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
我的公眾號,謝謝關注下。