dlsym方式调so(C调python)报错_ctypes.cpython-36m-x86_64-linux-gnu.so:undefined symbol:PyUnicode_FromFormmat

dlsym方式调so(其中so中用到C调python)报错ImportError: ~/anaconda3/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so: undefined symbol: PyUnicode_FromFormat

解决方法1:

在应用程序中,即在使用dlopen, dlsym之前,添加内容

#include //python 头文件

Py_initialize(); //初始话python库, 注意,这里测试程序结尾不要Py_Finalize()释放,

编译时添加 -I /root/anaconda3/lib/python3.6 m -lpython3.6m

如: g++ -o main main.cpp -ldl -I /root/anaconda3/include/python3.6m -lpython3.6m

解决方法2(记得dlclose()):(推荐这种方式)

在应用程序中,即在使用dlopen, dlsym之前,添加内容

void* pyso = dlopen("/usr/lib/libpython3.6m.so", RTLD_GLOBAL | RTLD_NOW);

解决方法3(记得dlclose()):

在编译so源文件中Py_initialize() 之前添加

void* pyso = dlopen("/usr/lib/libpython3.6m.so", RTLD_GLOBAL | RTLD_NOW);

编译应用程序时需添加参数-Wl,-rpath=/usr/lib,  注意必须是同路径/usr/lib,

【注:将so拷贝到另一个目录下如/home/下,然后指定-Wl,-rpath=/home,这样不行

注意:/usr/lib/下的libpython3.6m.so是libpython3.6m.so.1.0额符号链接,这里没问题。

但是如果想要把so拷贝到自己的目录下用,要拷贝源文件“libpython3.6m.so.1.0”,不能是libpython3.6m.so,也不能重命名

如拷贝到当前目录下,应该使用如下

void* pyso = dlopen("./libpython3.6m.so.1.0", RTLD_GLOBAL | RTLD_NOW);


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部