[Bug]Python3.x AttributeError: libtest.so: undefined symbol: fact

Posted 糖栗子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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);
}



以上是关于[Bug]Python3.x AttributeError: libtest.so: undefined symbol: fact的主要内容,如果未能解决你的问题,请参考以下文章

python的MRO和C3算法

Python3.x:zip()函数

python 2.x 和python3.x 区别

python3自动安装脚本,python3.x与python2.x共存

Python3.x:抢票

Python3.x与Python2.x的差异用法