python调用so库 undefind symbol_[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 "", line 1, in

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的方式进行编译,编译后的文件中仍然是定义的函数名

解决方法

改后缀为.c

声明为"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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值