linux 下的動態庫製作 以及在python 中如何調用 c 函數庫

linux 下的動態庫製作 以及在python 中如何調用 c 函數庫

  1. 動態庫:

    動態庫又稱動態鏈接庫英文爲DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。DLL 還有助於共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。Windows下動態庫爲.dll後綴,在linux在爲.so後綴。

  2. 動態庫製作:

     gcc -fPIC -g -c -Wall a.c

 gcc -fPIC -g -c -Wall b.c

 gcc -shared -Wl,-soname,liblusterstuff.so.1 -o liblusterstuff.so.1.0.1 a.o b.o -lc

注:  可以簡寫爲:   gcc -fPIC -O2 -shared mydll.c -o  mydll.so

3. python 中如何調用 c 語言生成的動態庫:

(1) : 先生成一個動態庫 : 如

    gcc  - fPIC -O2  -shared  print_lib.c   -o   print_lib.so

    ===================================================

      struct  stu

        {        

            int num;

            char name [30] ;

            float  score ;

        }

        void print0 ( int a )

         {

                      printf (" %d\n" , a );

        }

        void print 2 ( struct data)

        {

                        printf ("%d \n", data. num);

                        printf (" %s\n", data .name);

                        printf (" %f\n", data. score);

        }

        void print 3 ( struct * p)

        {

                        print (" %d\n", p->num);

                        print ("%s\n", p->name);

                        print ("%f\n", p->float);

        }

====================================================

(2): python 定一個傳給動態庫 的 數據類型

     from ctypes import *

    class py_st (Strutcture):

                _fields =

                [    ( "num", c_int), ("name", string) , ("score", c_float) ]

(3) python 使用動態庫:

    1.    // 加載動態庫

    fileName  = "home/ zyh / tmp / print_dll.so "

    lib = cdll . loadLibrary ( fileName)

    2.    // 定義變量

    param = py_st ( )

    3.   // 給結構體賦值

    param . num = 1001

    param . name =  "hello word"

    param . score = 95.5

    

    lib. print 0 ( 10)

    lib . print 1 ( param)

    lib . print 2 ( pointer (param) )

  


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