C调用python并封装成so遇到的问题及解决办法(win&linux)

您所在的位置:网站首页 python中调用math库 C调用python并封装成so遇到的问题及解决办法(win&linux)

C调用python并封装成so遇到的问题及解决办法(win&linux)

2023-03-14 22:17| 来源: 网络整理| 查看: 265

项目中需要对编写的python程序用C语言进行封装,并编写脚本使生成so库以便调用,因为初次实现相关程序,遇到了不少问题。

环境一:win+vscode+python3.6 问题一:无法找到Python.h头文件

解决办法:配置c_cpp_properties.json文件

如果导入includePath之后还是报错,那么考虑用绝对路径进行导入

还可以在编写的脚本中用参数-I指明头文件目录

gcc -I "C:/Users/DELL/AppData/Local/Programs/Python/Python36/include" ..... 问题二:-lpython36相关错误,即报错:collect2.exe: error: ld returned 1 exit status

关于这个问题当时有通过直接run和终端运行两种方式,直接run目前仍然没有解决。

关于终端运行,用gcc进行编译(g++类似),注意win环境下,包的名字是python36。链接库的主要难度则是找到对应的目录,一开始对anaconda安装的python环境始终找不到对应的库,于是到python官网下载了python3.6版本进行安装,找到如下所示对应目录,问题解决

gcc -I "C:/Users/DELL/AppData/Local/Programs/Python/Python36/include" \     -L "C:/Users/DELL/AppData/Local/Programs/Python/Python36/libs" \     -c ris_pyc.c -lpython36 gcc -I "C:/Users/DELL/AppData/Local/Programs/Python/Python36/include" \     -L "C:/Users/DELL/AppData/Local/Programs/Python/Python36/libs" \     -shared -fPIC -o libmyhello.so ris_pyc.o -lpython36 环境二:vmware+ubuntu20.04+vscode+python3.6 问题一:安装遇到:虚拟机>安装vmware tools灰色

配置CD/DVD(SATA)为自动检测,或者指定其CD镜像文件为VMware安装目录下的linux.iso,然后根据其他教程进行解压、安装

问题二:relocation R_X86_64_32 against `.rodata‘ can not be used when making a shared object;recompile with -fPIC

首先python安装过程中,此处使用了三个可选配置项,含义如下:

--enable-optimizations:用 PROFILE_TASK 启用以配置文件主导的优化(PGO)

--with-lto:在编译过程中启用链接时间优化(LTO)

--enable-shared:启用共享 Python 库 libpython 的编译

保证之后要链接的库生成,注意的是这里会生成.a和.so静态库与动态库,链接的是动态库,若只有静态库而对其进行链接,依然会报上述错误。编译之后,会在安装路径的lib文件下生成libpython3.6m.a、libpython3.6m.so、libpython3.6m.so.10、libpython3.so等文件,链接时即不再是-lpython36而是-lpython3.6m。

./configure --enable-optimizations --with-lto --enable-shared

除了python安装过程中需要注意so库链接的问题,还有一个点是在编译c文件生成.o文件时,也要加参数-fPIC。

gcc -I "/usr/local/include" \ -L "usr/local/lib" \ -fPIC -c ris_pyc.c -lpython3.6m gcc -I "/usr/local/include" \ -L "/usr/local/libs" \ -shared -fPIC -o libmyhello.so ris_pyc.o -lpython3.6m 问题三:error while loading shared libraries:libris.so:cannot open shared object file:No such file or directory

这是我作为新手的一个问题吧,生成了.so库之后,用main.c进行测试,但是编译成功之后报出此错,并且已经在命令中用-L指出链接库的目录。解决办法是,如果没有在环境中.bashrc文件直接export库生成的目录,那么每次打开新的终端运行编译生成的可执行文件都需要进行export库的所在目录



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3