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) )

时间: 2024-12-21 08:18:10

linux 下的动态库制作 以及在python 中如何调用 c 函数库的相关文章

Linux下的动态连接库及其实现机制

Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术逐一进行了详细讨论. 本文着重讨论x86体系结构,这是因为 (1)运行Linux的各种体系结构中,以x86最为普及: (2)该体系结构上的Windows操作系统广为人知,由此可以较容易的理解Linux的类似概念: 下表列出了Windows与Linux的近义词,文中将不加以区分: Windows Linux 动

linux下so动态库一些不为人知的秘密

linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.    基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls linux-vdso.so.1 => (0x00007fff597ff000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00000036c2e00000) librt.so.1 => /

linux下so动态库一些不为人知的秘密(转)

linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls 使用 ldd -u /bin/ls 查看不需要链接的so 大家知不知道linux从程序(program或对象)变成进程(process或进程),要经过哪些步骤呢,这里如果详细的说,估计要另开一篇文章.简单的说分三步:    1.fork进程,在内核创建

Linux下的动态库与静态库

2019-09-25 关键字:生成库.静态库引用.动态库引用 在 C 开发中,“库”是一个经常听到的名词. 所谓的库其实就是一个二进制文件.这个二进制文件的内容是可被其它C程序调用执行的函数.换句话说,库就是一组C代码的打包形式而已,打包是指将源代码以库的形式编译而生成的文件. 不过即使它只是源代码的打包,它也仍然是有系统专有性的,即不同系统下编译出来的库并不能互相兼容使用. C库可分为动态库与静态库两种.引用了外部库的应用程序在编译时会在”链接期“处理库与程序源码之间的关系. 1.静态库 静态

linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)

程序员都很懒,你懂的! 最近在开发中,需要用到服务器的ip和mac信息.但是服务器是架设在linux系统上的,对于多网口,在获取ip时就产生了很大的问题.下面是在windows系统上,java获取本地ip的方法.贴代码: package com.herman.test; import java.net.InetAddress; /** * @see 获取计算机ip * @author Herman.Xiong * @date 2014年5月16日 09:35:38 */ public class

F2833x 调用DSP函数库实现复数的FFT的方法

转载自:http://blog.csdn.net/aeecren/article/details/67644363:个人觉得写的很详细,值得一看 在数字信号处理中,FFT变换是经常使用到的,在DSP中自己编写的FFT变换函数通常会存在计算效率太慢的问题,有时需要调用DSP函数库自带的变换函数.但是,DSP在对FFT运算效率优化的同时,对于函数的调用方式也就有了比较多的要求,下面结合自己的调试经验做一下简单的介绍. 1.准备工作 DSP的数字信号处理的一系列函数都在C28x_FPU_Lib.lib

在Linux下编译生成动态库*.so后发现用dlopen打开时出错解决办法

在Linux下有时候编译的源文件可能有语法错误,但是很多时候还是能生成动态库,这个时候,用dlopen打开时就没有办法返回句柄,导致能生成动态库,却无法打开,这个时候最好的办法是不用dlopen动态调用的方法,而是使用静态调用的方法. 1.在测试文件中加上静态调用需要的头文件,同时将此头文件放在与测试文件同一个目录下,以便测试文件能够找到该头文件 2.将生成的库定位输出到/usr/lib(如果是64位系统,则是在/usr/lib64)文件夹中 3.编译时参考我的代码, gcc main.c -L

linux下动态链接库(.so)的显式调用和隐式调用

进入主题前,先看看两点预备知识. 一.显式调用和隐式调用的区别 我们知道,动态库相比静态库的区别是:静态库是编译时就加载到可执行文件中的,而动态库是在程序运行时完成加载的,所以使用动态库的程序的体积要比使用静态库程序的体积小,并且使用动态库的程序在运行时必须依赖所使用的动态库文件(.so文件),而使用静态库的程序一旦编译好,就不再需要依赖的静态库文件了(.a文件). 动态库的调用又分为显示和隐式两种方式,区别如下: 1. 隐式调用需要调用者写的代码量少,调用起来和使用当前项目下的函数一样直接:而

Linux下配login.sql,并在.bash_profile中配置SQLPATH

在linux下的目录/u01/oracle/sqlplus/admin下编写了一个login.sql,代码如下 ---login.sql-- define _editor=vim set serveroutput on size 1000000 set trimspool on set long 5000 set linesize 100 set pagesize 9999 column plan_plus_exp format a80 column global_name new_value