Linux 動態庫 so 使用

2021-06-06 11:23:16 字數 1610 閱讀 9443

折騰了會 dll 覺得不爽,改玩 so 去:

一.  編寫個c檔案:test.c

#include// file test.c

int say()

int add(int x, int y)

二. 編譯成動態庫 .so :

~ # gcc -shared -o test.so test.c

/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/cc3gkpar.o: relocation r_x86_64_32 against `.rodata' can not be used when ****** a shared object; recompile with -fpic

/tmp/cc3gkpar.o: could not read symbols: bad value

collect2: ld returned 1 exit status

出錯了,說是要加個 -fpic 引數(

編譯成位置無關**,不然你的程式在別的地方肯可能執行不了):

~ # gcc -fpic -shared -o test.so test.c

ok,成功!

三.  c語言中使用使用該動態庫(test.so)

1. 編寫c file

#include// file: myso.c

int main()

2. 編譯

~ # gcc -o myso myso.c /root/test.so

3. 執行

~ # ./myso

hello, linux so

1697202183

結果明顯不正確,3+4 怎麼會是 1697201283 ?  原來,add(3

+4) 引數傳錯了 !!

四. python中使用

1. 編寫python 檔案

#!/usr/bin/python

from ctypes import *

myso = cdll.loadlibrary('/root/test.so')

myso.say()

add = myso.add

add.argtypes = [c_int, c_int] #傳入引數型別

add.restype = c_int #返回值型別

print add(2,3)

2. 使用

~ # python myso.py

hello, linux so...

5

五.

Linux 動態鏈結庫 so 的使用

1.背景 庫 就是已經編寫好的,後續可以直接使用的 c 靜態庫 會合入到最終生成的程式,使得結果檔案比較大。優點是不再有任何依賴。c 動態庫 動態庫,乙個檔案可以多個 同時使用記憶體中只有乙份,節省記憶體,可以隨主 一起編譯。缺點是需要標頭檔案。說 庫就是除了main函式之外的其他 都可以組成庫。2...

Linux下動態庫 so 和靜態庫 a

一般情況下,在專案裡會把功能相似的 封裝成庫,方便使用和管理,同時增加了 的內聚性。庫分為兩種,一種為靜態庫,檔名以.a結尾,另一種是動態庫,檔名以.so結尾。靜態庫和動態庫的使用各有利弊。靜態庫的特點 動態庫的特點 現在用乙個微型的工程,來講述靜態庫 動態庫的生成和使用。假設有3個.c檔案,分別為...

linux中靜態庫 a 和動態庫 so

自 靜態庫 靜態庫在編譯的時候被固定在了可執行檔案中,而不是放在系統的某個地方由ld.so載入。這種做法好的一面是可執行檔案自己包含了所需的所有庫文 件,並不依賴於系統中的其他 也不會出現庫檔案缺失的情況。你可以把這些 複製給任何人,而它們保證可以工作。不好的一面就是可執行檔案不必要的增 大了,而且...