折騰了會 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載入。這種做法好的一面是可執行檔案自己包含了所需的所有庫文 件,並不依賴於系統中的其他 也不會出現庫檔案缺失的情況。你可以把這些 複製給任何人,而它們保證可以工作。不好的一面就是可執行檔案不必要的增 大了,而且...