【问题标题】:How do you make python recognize read a precompiled shared file?如何让 python 识别读取预编译的共享文件?
【发布时间】:2011-06-23 16:25:20
【问题描述】:

我有一个用 C++ 创建的包,并且已经将它编译到一个共享库中。

当我用自己的 main 函数链接它时,我可以通过直接调用初始化函数 initfoo 来初始化包,一切正常。

如何让 python 将我的共享库识别为一个包,所以我可以输入:

import foo

从常规 python 解释器运行?

我对使用 distutils 编译文件不感兴趣,因为编译必须是常规 cmake 构建系统的一部分。我只需要创建加载共享库所需的任何包文件。

更新: 我现在让它工作了。问题在于 cmake 默认为共享库名称的 lib 前缀。要解决这个问题需要

SET_TARGET_PROPERTIES(foo PROPERTIES PREFIX "")

对于 Mac OS X

SET_TARGET_PROPERTIES(foo PROPERTIES SUFFIX ".so")

【问题讨论】:

  • distutils 的存在特别是因为它自己可能会很麻烦(请参阅python-history.blogspot.com/2009/03/…) - 使用distutils 构建它(可能两次,如果在cmake构建中也需要它)完全没有问题?
  • 这是不可能的。我的命令调用了很多 C++ 函数。此外,在 Mac OS X 上,生成的共享库必须链接到我的所有其他共享库。

标签: c++ python cmake distutils python-c-api


【解决方案1】:

如果您有一个导出了 initfoo 符号的共享库(注意:由于您已标记问题 — 确保它是 extern "C" 符号,否则名称修改将阻止解释器找到它),那么它已经是一个 Python 模块,可以直接加载,无需进一步工作。您只需要确保它在搜索路径上,就像任何其他模块一样。

【讨论】:

  • 谢谢。我将 PYTHONPATH 变量设置为 $PWD 并验证“initfoo”函数是否未损坏,并且在符号表中。事实证明,.so 文件名必须是 foo.so,而不是 libfoo.so。谢谢。
猜你喜欢
  • 2020-07-19
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多