參考文章:
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表示路徑。