zoukankan      html  css  js  c++  java
  • python利用ctypes调用C++动态库

    用python调用C++动态库时,总是提示函数未找到,感觉大家也会遇到这种问题,就记录一下

    先是错误示范

    • 首先编写C++代码,新建test.cpp
    int add(int a,int b){ 
        return a+b;
    
    }
    
    • 利用g++生成动态库

    g++ test.cpp -fPIC -shared -o libtest.so

    • 再编写python调用,新建python_ctypes.py
    import ctypes
    if __name__ == '__main__':
        dl=ctypes.cdll.LoadLibrary
        lib=dl('./libtest.so')
        a=lib.add(2,3)
        print(a)
    
    • python python_ctypes.py就会报以下错误
    AttributeError: ./libtest.so: undefined symbol: add
    

    经过查阅,发现c++的编译后,为了实现重载,函数名会被改变,这时候要使用使用c的方式进行编译,编译后的文件中仍然是定义的函数名。有两种方式解决这个问题

    1. 将文件后缀改为.c,然后利用gcc生成动态库
    2. 使用extern "C" {},申明为C,利用g++使用c的方式编译

    这里推荐第二种方式

    • 重新写test.cpp文件
    #include<iostream>
    extern "C"{
            int add(int,int);
    }
    int add(int a,int b){  // 该函数需要接受三个参数
        return a+b;
    }
    
    • 然后再编译为动态库,调用就没问题了
  • 相关阅读:
    kill eclipse
    C语言之表达式运算整体提升
    查找函数对比:findall,search,match
    Linux backtrace()
    git本地协同
    git 撤销push到服务器的代码
    gtest
    C陷阱篇之enum默认长度
    程序员中文开发者手册
    C语言错题分析
  • 原文地址:https://www.cnblogs.com/peng-yuan/p/15043241.html
Copyright © 2011-2022 走看看