1基本概念
1作用
- 分離編譯
- 代碼重用
2動態庫和靜態庫的區別
- 靜態庫:
- 在可執行程序運行前就加入到執行碼中,成爲執行程序的一部分
- 一個或多個.o目標文件歸檔在一個文件中
- 對空間要求較低,而對時間要求較高的核心程序中
- 動態庫:
- 在可執行程序運行啓動時加入到執行程序中,可以被多個可執行程序共享使用
- 沒有main函數的可執行文件
- 對時間要求較低,而對空間要求較高的
2靜態庫的製作
2.1創建
- 編譯源文件:生成靜態庫的材料
g++ -c -o test.o test.cpp
- 生成靜態庫
ar -rcs libtest.a test.o //libtest.a是動態庫的名字
命令選項 | 作用 |
---|---|
r | 替換模塊(replace) |
c | 創建庫(create) |
s | 建立索引 |
2.2使用
-
注意:庫一定要放在命令行的末尾
- 鏈接靜態庫
g++ -o main main.cpp -L. -l庫民
g++ -o main main.cpp ./lib庫名.a
2.3函數的隱士聲明
- 返回值類型只有int型,
- 錯誤出現(因爲該文件編譯時還沒有連接庫,所以發現不了這些文函數,所以在文件中隱士聲明瞭這些函數)
- 解決方法:頭文件加聲明
2.4tar和ar都是歸檔工具
- tar用於創建.tar歸檔文件。
- ar用於創建歸檔文件,並且爲歸檔的目標文件中的符號建立索引。
3動態庫製作及使用
3.1創建
- 編譯目標文件:生成製作動態庫的材料
g++/gcc -c test.cpp -o test.o -fPIC //(生成與位置無關的代碼 -fPIC)
- 生成動態庫
g++/gcc -shared lib庫名.so text.o
3.2使用
- 編譯可執行程序時,指定所使用的動態庫。-l:庫名 -L:指定庫路徑
gcc text.c -o a.out -lmymath -L./lib
- 運行可執行文件 ./a.out
4動態庫加載錯誤願因和結局方法
- 運行可執行文件 ./a.out:但是會出錯可是我給了位置和庫名,爲什麼還會出錯?:因爲動態鏈器器提供動態庫所在目錄位置,但是隻會在固定目錄尋找動態庫,如果找不到就報錯。
- 原因 (動態鏈接器報錯)
- 鏈接器:工作於鏈接狀態,工作需要-l 和 -L
- 動態鏈接器: 工作於程序運行時間。工作的時候需要提供動態庫所在目錄位置。
- 改正方法
- 臨時生效
- 改變環境變量export LD_LIBRARY_PATH=./lib( 終端重啓環境變量實失效)
- 永久生效方法1:
- vim ~./bashrc(環境變量的配置文件)
- 寫入 export LD_LIBRARYPATH=動態庫路徑
- …bashrc/ source.bashrc /重啓 終端
- 永久生效方法2:
- 拷貝自定義動態庫 到/lib(標準C庫所在目錄中)
- 永久生效方法3:
- vim /etc/ld.so.conf
- 寫入動態庫絕對路徑保存
- sudo ldconfig -v使配置文件生效
- ./a.out 成功
- 臨時生效
- 原因 (動態鏈接器報錯)
5注意點
- 當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。
- 查看執行文件鏈接的動態鏈接庫
ldd 可執行文件