zoukankan      html  css  js  c++  java
  • [Bug]Python3.x AttributeError: libtest.so: undefined symbol: fact

    写kNN,需要在python中实现kd-tree
    思考了一下,在python下写这种算法类的东西,还是十分别扭
    于是希望用ctypes调用一下c++动态加载库

    于是尝试实现一下

    // test.cpp
    long long fact(int n){
        return (n<=0):1:(fact(n-1)*n);
    }
    
    // gcc -shared -fpic test.cpp  -o libtest.so
    
    // test.py
    import ctypes
    
    lib=ctypes.cdll.LoadLibrary("libtest.so")
    print(lib.fact(10))
    
    

    于是报错

    Traceback (most recent call last):                              
      File "<stdin>", line 1, in <module>                    
      File "/usr/lib/python3.6/ctypes/__init__.py", line 361, in __getattr__
        func = self.__getitem__(name)                    
      File "/usr/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__
        func = self._FuncPtr((name_or_ordinal, self))
    AttributeError: libtest.so: undefined symbol: fact 
    

    最后百度发现原因是c++的编译后,函数名会被改变(为了实现重载)
    用extern "C"声明后,就会使用c的方式进行编译,编译后的文件中仍然是定义的函数名

    解决方法

    1. 改后缀为.c
    2. 声明为"C", 以c方式编译即可
    // test,cpp
    // g++ -fpiv -shared test.cpp -o libtest.so
    extern "C"{
        long long fact(int);
    }
    
    long long fact(int n){
        return (n<=0):1:(fact(n-1)*n);
    }
    
  • 相关阅读:
    jmeter非GUI界面运行脚本
    jmeter函数助手
    jmeter远程压力测试
    linux无工具命令监控
    nmon定时任务
    nmon安装
    Charles抓包
    正交工具allpairs应用
    数据库常用架构和同步工作原理
    ARTS习惯(2)
  • 原文地址:https://www.cnblogs.com/tanglizi/p/8965230.html
Copyright © 2011-2022 走看看