3 共享庫的建立與使用

2021-08-03 22:35:09 字數 2195 閱讀 2610

1. 編寫**

int add(int a, int b) 

int sub(int a, int b)

# base.h的內容

int add(int, int);

int sub(int, int);

#include#include "base.h"

int main()

2. 生成動態庫

gcc -c -fpic add.c sub.c

gcc -shared add.o sub.o -o libbase.so

或gcc -fpic -shared add.c sub.c -o libbase.so

3. 使用動態庫

方式1:執行如下兩條命令會再當前目錄下生成main程式

gcc -c main.c

gcc main.o ./libbase.so -o main

執行ldd main命令可以看到main鏈結庫的資訊

ldd main

linux-vdso.so.1 => (0x00007ffec5bb7000)

libbase.so (0x00007fddb700e000)

libc.so.6 => /usr/lib64/libc.so.6 (0x00007fddb6c31000)

/lib64/ld-linux-x86-64.so.2 (0x00007fddb7211000)

方式2:執行如下命令生成main程式

注意:此處與上面的方式不同之處在於指定鏈結庫路徑及鏈結庫名稱

gcc -c main.c

gcc main.o -l. -lbase -o main

生成main之後, 執行ldd main檢視鏈結庫資訊

ldd main

linux-vdso.so.1 => (0x00007fff78bb1000)

libbase.so => not found

libc.so.6 => /usr/lib64/libc.so.6 (0x00007fefcd5ea000)

/lib64/ld-linux-x86-64.so.2 (0x00007fefcd9c8000)

不難看出, 如上的方式生成的可執行檔案main, 在使用ldd檢視時, 提示libbase.so未找到

這是因為-l及-l選項只是告訴編譯器庫的名字, 而在目標系統支援的情況下, fpic會生成與位置無關的**

因此實際上編譯之後的main中並未記錄libbase.so的位置, 仍在系統預設的路徑查詢

可以使用如下方式進行解決

export ld_library_path = /home/developer/c/

或export ld_library_path = /home/developer/c/libbase.so

再次使用ldd main檢視時, 就不會報錯not found

ldd main

linux-vdso.so.1 => (0x00007ffd767ad000)

libbase.so => /home/developer/c/libbase.so (0x00007f50e3154000)

libc.so.6 => /usr/lib64/libc.so.6 (0x00007f50e2d77000)

/lib64/ld-linux-x86-64.so.2 (0x00007f50e3357000)

當然也可以配置系統的ld.so.conf檔案進行配置, 配置之後執行ldconfig命令即可

以上內容, 如有錯誤, 歡迎批評指正。

QT Creator使用共享庫(一)建立共享庫

最近使用qt的移動裝置要呼叫個加密的.so,在前人 上折騰了n久也沒出來,終於自己照著幫助一步步作了一下,在此記下一筆。使用的工具 qt creator 測試環境 win 7,qt平台的外設 首先我們寫個共享的庫檔案 1.建立c 庫,選擇共享庫 2.在標頭檔案裡加上個方法,並在自動生成的類裡也加上個...

庫的建立與使用

庫的建立與使用。一 靜態庫的建立與使用 建立乙個庫,含有加減乘除演算法 1 首先編寫演算法程式 如何進入多視窗模式 在底層模式下輸入sp,ctrl ww 游標視窗切換 ctrl wj 游標向下切換 ctrl wk 游標向上切換 2 編寫main函式 3 將加減乘除轉換為.o檔案 4 建立庫 注意 靜...

Qt之建立並使用共享庫

在 windows 中,有動態鏈結庫 dll dynamic link library 在 linux 中,有共享庫 shared library 它們是相同的!由於平台和編譯器的差異,輸出的庫檔案也不同 要建立乙個共享庫,需要執行以下幾個步驟 檔案 新建檔案或專案,選擇 library c 庫 選...