Linux环境下创建并使用动态链接库

本文介绍了一个C语言DLL的创建过程及其与Python的交互方式。通过具体代码示例展示了如何在C语言中实现基本数学运算并将其导出为DLL,再利用Python的ctypes模块调用DLL中的函数进行计算。

在桌面创建dll.c文件,将下面代码复制进去。

#include "dll.h"

int sum(int* a, int n)
{  int i,s=0;
   for (i=0;i<n;i++) s+=a[i];
   return s;
}

int plus(int a, int b)
{  return a+b; }
在桌面创建dll.h文件,将下面代码复制进去。

#ifndef DLL_H  
#define DLL_H  

int sum(int* a, int n); 
int plus(int a, int b); 

#endif

在cmd中运行如下命令。


然后桌面上就会多出.o和.so文件。


打开Canopy创建测试程序,文件名为:test.py,并将下面的代码复制到test.py里去。

# -*- coding: utf-8_ -*-
import wx
import ctypes
import sys
sys.path.append('.')

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'DLL Example', size=(300, 200))
        panel = wx.Panel(self, wx.ID_ANY) 
        In=wx.StaticText(panel, wx.ID_ANY, u"         输入:")
        self.InText = wx.TextCtrl(panel, wx.ID_ANY, "1 2",  size=(175, -1))
        self.InText.SetInsertionPoint(0)
        
        Out=wx.StaticText(panel, wx.ID_ANY, u"  DLL计算结果:")
        self.OutText = wx.TextCtrl(panel, wx.ID_ANY, " ", size=(175, -1))
        
        Compute=wx.Button(panel, wx.ID_ANY, u"计算", size=(50, -1))
        
        self.Bind(wx.EVT_BUTTON, self.EvtCompute, Compute)
        
        Exit=wx.Button(panel, wx.ID_ANY, u"退出", size=(50, -1))
        self.Bind(wx.EVT_BUTTON, self.EvtExit, Exit)
        
        sizer = wx.FlexGridSizer(cols=2, hgap=10, vgap=10)
        sizer.AddMany([In, self.InText,Out, self.OutText,Compute,Exit])
        panel.SetSizer(sizer)
        self.Centre()
        
        # known Canopy bug: absolute filename required
        self.cdll=ctypes.CDLL("/home/wx/Desktop/dll.so")
        
    def EvtCompute(self, event):
        a=[int(x) for x in self.InText.GetValue().split()]
        if len(a)==2:
            result=self.cdll.plus(a[0],a[1])
        else:
            result=self.cdll.sum(ctypes.ARRAY(ctypes.c_int,len(a))(*a),len(a))
        
        self.OutText.SetValue(str(result))
        
    def EvtExit(self, event): self.Destroy()
        
if __name__ == '__main__':
#    import os
#    os.chdir(r"your working directory")
    app = wx.App()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()
注意修改动态链接库的路径名!

然后就可以运行了。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值