linux 下編譯生成靜態庫和動態庫

2021-08-17 06:38:29 字數 2026 閱讀 3941

我們此處為了說明靜態庫和動態庫的編譯,會使用示例**。建立  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 從靜態庫檔...