Linux下動態庫so的生成與使用



.  編寫個C文件:test.c

 

[cpp] viewplaincopyprint?

1. #include<stdio.h>  

2. // file test.c  

3. int say()  

4. {  

5.     printf("Hello, Linux so\n");  

6.     return 0;  

7. }  

8.   

9. int add(int x, int y)  

10. {  

11.     return x+y;  

12. }  


. 編譯成動態庫 .so

 

 

[plain] viewplaincopyprint?

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

2. /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 making a shared object; recompile with -fPIC  

3. /tmp/cc3GkPar.o: could not read symbols: Bad value  

4. collect2: ld returned 1 exit status  


出錯了,說是要加個 -fPIC 參數(編譯成位置無關代碼,不然你的程序在別的地方肯可能運行不了):

 

 

[plain] viewplaincopyprint?

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


OK
,成功!

 

 

.  C語言中使用使用該動態庫(test.so

1. 編寫C file

 

[cpp] viewplaincopyprint?

1. #include<stdio.h>  

2. // file: myso.c  

3. int main()  

4. {  

5.     say();  

6.     printf("%d\n",add(3+4));  

7.     return 0;  

8. }  


2.
編譯

 

 

[plain] viewplaincopyprint?

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

 

3. 運行

 

[plain] viewplaincopyprint?

1. ~ # ./myso  

2. Hello, Linux so  

3. 1697202183  


結果明顯不正確,3+4 怎麼會是 1697201283  原來,add(3+4) 參數傳錯了 !!

 

 

. Python中使用

1. 編寫Python 文件

 

[python] viewplaincopyprint?

1. #!/usr/bin/python  

2. from ctypes import *  

3.   

4. myso = cdll.LoadLibrary('/root/test.so')  

5.   

6. myso.say()  

7.   

8. add = myso.add  

9. add.argtypes = [c_int, c_int]    #傳入參數類型  

10. add.restype = c_int              #返回值類型  

11.   

12. print add(2,3)  


2.
使用

 

 

[python] viewplaincopyprint?

1.  ~ # python myso.py  

2. Hello, Linux so...  

3.  

4. 5  

 

http://blog.sina.com.cn/s/blog_7769660f01011pf1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章