1. 程式人生 > >C語言動態庫建立方法,以及和python混合程式設計

C語言動態庫建立方法,以及和python混合程式設計

這篇小結是2016年暑假在新疆出差階段所寫,因為專案需要所以研究了一下。

如有錯誤,歡迎互相交流。

不同編譯器實現python呼叫C語言動態庫方法小結

  • Windows平臺下Visual Studio 2010編譯器建立動態庫,並呼叫

第一步:建立動態dll動態庫

1開啟visual studio,新建一個專案,選擇Visual  C++建立一個Win32 控制檯應用程式,命名為test5。

2點選確定,彈出應用程式設計嚮導,擊下一步,選擇DLL,空專案,再點選完成。

3用右鍵點選專案test5裡面的原始檔,新增新建項,選擇【C++檔案(.cpp)】,命名為test5.c。注意:名稱後面一定要加C語言檔案字尾名.c。亦可用*.cpp。

4在test5.c中編寫將被Python呼叫的函式(將一個數組按從下到大排序):

////////////////////////////////////

#include <stdio.h>

__declspec(dllexport)             

void sort(int a[10])

{

    int i,j,k,t;                        

    printf("go \n");

    for(i=0;i<10;i++)

    {

        k=i;

        for(j=i+1;j<10;j++)

        {

            if (a[j]<a[k])

                k=j;

            t=a[k];

            a[k]=a[i];

            a[i]=t;

        }}

    printf("end \n");

}

///////////////////////////////////

注意:在visual studio 裡面最好把所有的變數定義和說明放在函式開頭,否則便會出現:【error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)】這類報錯。這是因為純C語言標準規定要求區域性變數定義必須在函式或區域性空間的開頭,然後才能有其它語句。

同樣的在編輯器codeblocks裡面就可以不用管這些標準規定,可以很順利地生成動態庫檔案。

5點選生成選單下的生成解決方案(快捷鍵F7)。如果出現【error LNK1123:轉換到COFF期間失敗:檔案無效或損壞】的報錯,請將選單欄中的【專案】→【屬性】→【配置屬性】→【清單工具】→【輸入和輸出】→【嵌入清單】:原來是“是”,改成“否”。

6在專案test5資料夾下的“Debug”目錄下會生成test5.dll動態庫檔案。同時可以通過命令列方式執行下面命令:

gcc -Wall -shared test5.c -o test5.dll

也可以生成test5.dll動態庫檔案。

7如果想要生成release版的dll動態庫檔案,請選擇選單欄目【生成】→【配置管理器】,將專案test5的配置方式由“Debug”改為“Release”。最後點選【重新生成解決方案】,就可以在test5檔案下的“Release”目錄下找到relese版的dll動態庫檔案了。

第二步 Python 2.7呼叫test5.dll動態庫

1將test5.dll檔案拷貝到python環境變數所包含的目錄裡面。

2在python裡面引用test.dll時,用ctypes模組裡面的cdll子模組,而不是通常介紹的windll模組,具體原因暫時還不清楚。

  • Gcc編譯器建立動態庫.so

注意windows下需要先下載MinGW安裝 包(包含gcc v4.7.1編譯器),然後在環境變數PATH中加入gcc編譯器的執行檔案的路徑。但是因為我的電腦裡面裝有codeblocks編輯器,裡面自帶了MinGW,所以直接下載codeblock也行。

1先編寫C語言檔案;

2開啟cmd管理員視窗,進入源程式C檔案的指定資料夾目錄下面,執行下面命令:

gcc -o test.so -shared -fPIC test.c

此時生成test.so檔案,同樣將該檔案拷貝到python環境變數所包含的目錄裡面;

3.so動態庫的呼叫和上面介紹的.dll的呼叫方法一樣,都是匯入ctypes模組中的cdll子模組。