Linux裡的函式庫 Library

2021-05-23 18:52:38 字數 1662 閱讀 6056

http://sourceware.org/binutils/docs/ld/version.html :關於動態庫的版本資訊

在linux裡面,有2種基本的庫的形式:

static: 靜態的庫,一般稱為archive,就是將多個object file合併成乙個檔案,然後在程式編譯的時候靜態鏈結,並且將使用的函式靜態的寫入最終的可執行程式裡面。

dynamic:動態庫。

程式靜態的呼叫,但是具體的呼叫過程是在動態載入的。

函式庫完全動態的載入,在編譯的時候完全不需要有函式的鏈結過程出現。適合用來進行plugin模式的開發。

這裡主要是講動態庫的問題。

當編輯好動態庫的源**之後,使用下面的命令進行編譯。

gcc -wall -fpic -c *.c

gcc -shared -wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o

其中第1步裡面的-fpic是對於生成動態庫所必須的。關於這兩條命令的具體引數的含義可以看[1]。

而在程式執行的時候,需要讓程式載入器找到對應的函式庫。

可以通過下面3種方式來把新增加的函式庫記錄載入到系統中。

(永久)將動態函式庫的目錄名新增到 /etc/ld.so.conf裡面去。然後用root許可權執行ldconfig命令進行重新的載入。

(臨時)使用ldconfig -n /path/to/the/dir 來臨時載入指定的目錄。這個方法在重啟之後就會失效。

(臨時)在ld_lirbary_path裡面新增函式庫的目錄,這樣就可以指定ld.so的載入庫的搜尋路徑。

所謂的name mangle,也就是c++在聲稱object file的時候,會把函式名變成一些不易利用的名字,而不是像c那樣是完全照字面上的函式名那樣存在object file裡面。這個可以通過nm命令來檢視。

如果對乙個c的函式庫使用nm來檢視裡面的的定義,比如我在**裡面定義了test()函式,那麼在nm輸出裡面也可以看到test。

但是在c++的nm輸出裡面,則是沒有test的,說明編譯器將名字做了一些變換(mangle)。

如果想要在c程式裡面直接呼叫c++裡面定義的函式的話,那麼會在鏈結的時候出現undefined reference的錯誤。所以需要在寫c++的做一些工作。

我將這個過程寫作c++  -> c

如果要將c++裡面的函式暴露成c也可以呼叫的話,那麼我們需要將函式的定義放在extern "c" directive裡面,具體如下。

這樣就可以將函式暴露給c了。

而如果要在c++裡面呼叫c的函式的話,也是要做相應的一些操作的。我們需要在編譯c++程式的時候,讓編譯器之後我們呼叫的函式是從c裡面來的。

在c++裡面將函式宣告放在extern "c" directive後面就可以了。如下:

使用動態載入的方式載入函式庫

需要使用dlfcn.h函式庫。如下是乙個使用的過程的例子:

然後使用下面的命令編譯:

gcc -rdynamic -o progdl progdl.c -ldl

Linux 下的靜態(函式)庫 動態(函式)庫

不用指定生成.o檔名 預設生成file1.o,file2.o,file3.o ar rv libname.a file1.o file2.o file3.or 將flie1.o,file2,o,file3.o插入archive,如故原先archive中已經存在某檔案,則先將該檔案刪除。v 顯示ar操...

Linux的靜態函式庫和動態函式庫

一 在linux中,有兩種函式庫,以 so字尾命名的是動態函式庫,以 a字尾命名的是靜態函式庫 二 靜態函式庫 1 靜態函式庫是多個目標檔案 o的集合 2 可以使用ar命令 archiver 來生成.a檔案 gcc c part a.c gcc c part b.c ar r libtest.a p...

Linux 共享函式庫的管理

共享函式庫分為靜態鏈結庫和動態鏈結庫。靜態鏈結的好處,是程式被搬移到另乙個同質系統而不必重新編譯,就可順利執行 缺點是它們的體積比較龐大,需要較多記憶體。動態鏈結庫的優缺點剛好與靜態鏈結庫互補,所浪費記憶體較少 特別是同時執行多個動態鏈結的程式且它們共享許多通用函式時 但是如果將檔案搬移到另乙個系統...