qq_43076825
失伟
采纳率100%
2020-11-30 13:28 阅读 213

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

18条回答 默认 最新

  • 已采纳
    rubikchen 502203305 2020-11-30 16:25

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 14:18

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 14:53

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

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 15:08

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 15:22

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

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 15:33

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 15:48

    RTLD_LAZY改为RTLD_NOW.

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 16:05

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

    点赞 1 评论 复制链接分享
  • rubikchen 502203305 2020-11-30 16:23

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

    点赞 1 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 14:32

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

    点赞 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 15:03

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

    点赞 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 15:12

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

    点赞 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 15:25

    直接没有反应😂

    点赞 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 15:37

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

    点赞 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 16:02

    改成RTLD_NOW显示段错误

    点赞 评论 复制链接分享
  • qq_43076825 失伟 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文件里的函数名

    点赞 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 17:12

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

    点赞 评论 复制链接分享
  • qq_43076825 失伟 2020-11-30 17:13

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

    点赞 评论 复制链接分享

相关推荐