我是distutils的新手,遇到一个困扰我的问题。我正在编译一个需要扩展的软件包,所以我这样创建了扩展:
a_module = Extension(
"amodule",
["initmodule.cpp"],
library_dirs=libdirs,
extra_objects = [
"unix/x86_64/lib/liba.so"
"unix/x86_64/lib/lib.so",
"unix/x86_64/lib/libc.so"],
)
然后我运行了setup方法:
setup(name="apackage", version="7.2",
package_dir = {'':instdir+'/a/b/python'},
packages=['apackage','package.tests'],
ext_modules=[hoc_module]
)
包的分发已经正确完成,我可以顺利地运行“python setup.py install”,但是当我尝试导入我的包时,出现了错误ImportError: liba.so.0: cannot open shared object file: No such file or directory
。我意识到,当我将liba.so.0的路径添加到LD_LIBRARY_PATH中时,程序可以正常运行。不幸的是,我没有编写这些模块,也不太了解编译过程。我已经尝试了几天,但仍然无法解决这个问题。
更新:我尝试将liba.a、libb.a等文件传递给extra_objects,但这并没有起作用,生成了以下错误:liba.a: could not read symbols: Bad value collect2: ld returned 1 exit status。我的目标是打包一个Python模块,该模块需要编译一个库,而该库本身依赖其他库,我需要将这些库包含在软件包中。我怀疑我的问题与这个问题非常相似:http://mail.python.org/pipermail/distutils-sig/2009-February/010960.html,但那个问题没有解决,我想也许因为它已经两年了,可能已经找到了解决方法?
更新2:目前,我通过执行以下操作解决了这个问题:
data_files=[('/usr/local/lib', glob.glob('unix/x86_64/lib/*'))]
也就是说,我正在将我需要的库复制到 /usr/local/lib 下。然而,我对这个解决方案并不是非常满意,因为它要求我的用户具有 root 权限,而且在 Redhat 发行版上可能仍然无法工作。因此,如果有人能提出比这个修复更好的建议,请告诉我。
Extension
定义中添加runtime_library_dirs="$ORIGIN/../lib/"
(实际上是相同的效果)来达到相同的目的。 - David Robinsonruntime_library_dirs
是特定于Python的。 - Brian Vandenberg$ORIGIN
时,我应该警告一些东西:如果应用程序以suid/setuid方式运行,则ldd
仅在运行时使用完全限定的路径。不是每个操作系统都处理它的方式相同;有些可能会完全跳过带有$ORIGIN
的路径,而其他一些则只是直接使用字符串(例如,使用truss
/strace
,您将看到尝试打开$ORIGIN/../lib/libsomelib.so
)。 - Brian Vandenberg