失伟 2020-11-30 13:28 采纳率: 100%
浏览 644
已采纳

linux下python调用so文件库,报错

使用c能够正常调用该so文件,使用python调用报错: undefined symbol: _Z16DetectStruts2052jiPcS_iRi

  • 写回答

18条回答 默认 最新

  • 502203305 2020-11-30 16:25
    关注

    你后面的那个案例可以在编译的时候以 ./test_a.so 的方式编译,就不会出错。即 gcc -g -o main.so main.c ./test_a.so -shared -fPIC

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 502203305 2020-11-30 14:18
    关注

    先看看有没有这个符号。这种符号名,一看就不是extern "C"修饰的符号。

    评论
  • 失伟 2020-11-30 14:32
    关注

    就是大概so文件里有个主函数main,主函数用 extern "C" { main(){}  }修饰了,mian里调用的其他函数也要用 extern "C"修饰么

    评论
  • 502203305 2020-11-30 14:53
    关注

    你在python里面调用的函数都需要放在extern "c"里面。其他的就不用。

    你这个是在库加载的时候就失败,建议使用`ldd xxx.so`查看一下依赖的库是否完整。

    评论
  • 失伟 2020-11-30 15:03
    关注

    依赖的库都是完整的,python调用的函数在 extern "c",可是还没到调用那一步,只是在cdll.LoadLibrary()加载的时候就报错了

    评论
  • 502203305 2020-11-30 15:08
    关注

    那就很有可能是你的so确实没有定义这个符号,加个`main`函数编译成可执行文件看看是否真的完整。

    评论
  • 失伟 2020-11-30 15:12
    关注

    这个so文件是我们领导编译完给我的,😂,最主要是我用c调用了,竟然好使,python调用报错,那就是python的ctypes的问题,难受😭

    评论
  • 502203305 2020-11-30 15:22
    关注

    C下用LAZY模式打开可能没有问题。你用NOW模式打开试试。

    也可以使用指令 nm xxx.so | grep DetectStructs 查看结果,如果是 U 说明这个符号没有定义。

    评论
  • 失伟 2020-11-30 15:25
    关注

    直接没有反应😂

    评论
  • 502203305 2020-11-30 15:33
    关注

    你用NOW模式打开,判断返回值,并调用对应函数都没有问题?

    评论
  • 失伟 2020-11-30 15:37
    关注

    我不知道now模式是啥😥,不过这是我用c写的调用so文件的脚本,然后运行就有结果

    评论
  • 502203305 2020-11-30 15:48
    关注

    RTLD_LAZY改为RTLD_NOW.

    然后判断handle的返回值是否成功。

    评论
  • 失伟 2020-11-30 16:02
    关注

    改成RTLD_NOW显示段错误

    评论
  • 502203305 2020-11-30 16:05
    关注

    你输出一下handle的值是多少。很可能是NULL,如果是的话就说明你领导传给你的so有问题。

    评论
  • 失伟 2020-11-30 16:13
    关注

    是Null,是什么问题呢,另外我自己也做了个测试,就是新建一个,test_a.c文件,编译成test_a.so文件,然后在写一个mian.c文件,然后main直接能调用test_a.so文件,运行有结果,然后把main编译成main.so文件,再用python调用main.so也报同样的错误,而test_a就是我test_a文件里的函数名

    评论
  • 502203305 2020-11-30 16:23
    关注

    先检查你的库依赖是否完整。不完整就会出现加载失败。返回错误

    评论
  • 失伟 2020-11-30 17:12
    关注

    感谢大哥,好像是这个问题,按照你的方式改了,没报错,

    评论
  • 失伟 2020-11-30 17:13
    关注

    感谢大哥,能加个联系方式么

    评论
查看更多回答(17条)

报告相同问题?

悬赏问题

  • ¥15 二分类改为多分类问题
  • ¥15 Unity微信小游戏上调用ReadPixels()方法报错
  • ¥15 如何通过求后验分布求得样本中属于两种物种其中一种的概率?
  • ¥15 q从常量变成sin函数,怎么改写python代码?
  • ¥15 图论编程问题,有可以指导的吗
  • ¥15 DEA的CCR模型画图
  • ¥15 请假各位一个关于安卓车机的问题
  • ¥15 光谱仪怎么看这样的透射谱
  • ¥15 pyqt5 如何实现输入框输入关键词,下拉框显示模糊查询返回的结果?
  • ¥20 fluent模拟,可以燃烧和相变同时模拟吗?