我們此處為了說明靜態庫和動態庫的編譯,會使用示例**。建立 test.h, hello.cpp 和 world.cpp, 在兩個原始檔中分別實現兩個函式( 此處都是示例**,檔案命名不規範,理解意思即可 )。
test.h (靜態庫標頭檔案)
#ifndef _test_
#define _test_
void hello();
void world();
#endif
hello.cpp:
#include #include "test.h"
using namespace std;
void hello()
world.cpp:
#include #include "test.h"
using namespace std;
void world()
linux 下靜態庫的命名規則為
lib+庫名+.a
1、首先將源資料夾編譯成目標檔案 ( hello.o, world.o )
g++ -c hello.cpp world.cpp
注意 -c 引數是必須帶,生成目標**(機器**),如果不帶該引數,則是編譯鏈結,由於沒有main 函式,編譯時會報錯。編譯完成之後生成 hello.o 和 world.o
2、用ar 工具將目標檔案打包成 .a 靜態庫 ( libtest.lib )
ar -crv libtest.lib hello.o world.o
linux 下動態庫的命名規則為
lib+庫名+.so
1、生成目標檔案(hello.o world.o),此時需要加編譯器 選項 -fpic
g++ -fpic -c hello.cpp world.cpp
2、生成動態庫,
g++ -share -o libtest.so hello.o world.o
也可以將上面兩步合併為一步
g++ -fpic -share -o libtest.so hello.pp world.cpp
如果生成的動態庫不在 /lib 或者 /usr/lib 目錄下,則需要將動態庫的路徑新增到 /etc/ld.so.cache 檔案中,只有這樣程式在執行時才能找到動態庫, 新增步驟如下:
1、編輯 /etc/ld.so.conf 檔案,將動態庫路徑加入該檔案
2、呼叫 ldconfig 命令,重建 /etc/ld.so.cache 檔案。
更為專業的生成動態庫方式如下:
g++ -shared -wl, -soname, libtest.so.1 -o libtest.so.1.10 hello.o world.o
編譯完成之後生成 libtest.so.1.10 庫檔案,這是庫的 realname
此時還需要將庫路徑新增入 /etc/ld.so.conf 中,然後 ldconfig -v 命令更新配置檔案
更新完之後,生成了 libtest.so.1 檔案,是庫的 soname (執行時的時候用 soname,只記錄主版本號,檢查主版本是否正確)
呼叫如下命令,生成 linkname (linkname 在編譯鏈結階段使用,方便 makefile)
ln -s libtest.so libtest.so.1.10
動態庫和靜態庫的呼叫方式相同, 以 main.cpp 中呼叫庫函式說明:
g++ -o main.exe main.cpp -l . -ltest
其中 -l 選項指明庫函式的位置
-ltest 為庫名的縮寫,只有完全按照linux 庫命名規則命名的庫才能採用縮寫。全名為 libtest.a 或 libtest.so
Linux下靜態庫編譯
linux下動態庫檔案的擴充套件名為 so shared object 按照約定,所有動態庫檔名的形式是libname.so 可能在名字中加入版本號 這樣,執行緒函式庫被稱作libthread.so。靜態庫的檔名形式是libname.a。共享archive的檔名形式是libname.sa。共享arc...
Linux下靜態庫生成和使用
1.庫是預編譯的目標檔案 object files 的集合,它們可以被鏈結程序式。靜態庫以後綴為 a 的特殊的存檔 archive file 儲存。2.標準系統庫可在目錄 usr lib與 lib中找到。比如,在類unix系統中c語言的數序庫一般儲存為檔案 usr lib libm.a。該庫中函式的...
Linux下編譯靜態庫 a 和動態庫 so
靜態庫 在linux環境中,使用ar命令建立靜態庫檔案.如下是命令的選項 d 從指定的靜態庫檔案中刪除檔案 m 把檔案移動到指定的靜態庫檔案中 p 把靜態庫檔案中指定的檔案輸出到標準輸出 q 快速地把檔案追加到靜態庫檔案中 r 把檔案插入到靜態庫檔案中 t 顯示靜態庫檔案中檔案的列表 x 從靜態庫檔...