1. 苏葳的备忘录首页
  2. 开发工具

Linux的.so文件调用embed Python的问题

gcc python linuxPython 2.7.3用./configure make make install生成后,在其目录下有libpython2.7.a文件。此文件可用于对C调用python的可执行文件的链接。然而将调用python的C函数编译进so的过程中却报错。提示需加-fPIC参数之类,开始一愣,以为是.so的源码编译参数有问题,查看了确实有-fPIC和-shared的选项。后来才想起.a文件一般不可直接静态链接入.so文件。查看Python 2.7.3的Makefile文件,里面有.so和dylib之类的编译指令,但是实际编译却未产生.so文件。

查找资料,有提示说需为./configure 加–enable-shared 选项。清理并加–enable-shared后重新编译,果然除了.a之外,还产生了libpython.2.7.so和lypython.2.7.so.1.0两个文件,此二文件用md5sum检验,完全相同,而在make install之后,在/usr/local/lib中libpython2.7.so干脆就是.so.1.0文件的一个链接。将自己的C模块编译Makefile中的.a改为.so后,编译通过。

然而Python加–enable-shared配置后编译,出现很多问题,许多包编译失败,虽不影响当前使用,以后也许会出问题。所以这些错误提示也需要解决。

没想到这么快就找出原因了。出现的许多模块编译失败的原因,其实是因为在configure清理前,未执行make distclean所致。Python编译时会生成许多模块,最后组装成Python和libpython.2.7.a,在–enable-shared之前未执行distclean,导致原静态编译的各模块依然存在。这样在动态链接时把这些静态模块链入动态目标文件,当然要出问题。

make clean
make distclean
./configure LDFLAGS=-L. --enable-shared
make

彻底清理后,完全重新编译,同时指定查找库目录为当前正在编译的python目录,这样就能得到与未加–enable-shared参数时的静态编译时一样的结果了。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/400.html

发表评论

邮箱地址不会被公开。 必填项已用*标注