在 Linux 中将 boost-python 与 C++ 一起使用

Posted

技术标签:

【中文标题】在 Linux 中将 boost-python 与 C++ 一起使用【英文标题】:Using boost-python with C++ in Linux 【发布时间】:2008-09-15 21:11:30 【问题描述】:

我的开发工作室已经组装了一个相当有用的基于 Python 的测试套件,我们想用它来测试一些基于 Linux 的 C++ 代码。我们已经得到了他们与 Boost 一起提供的测试项目进行编译(在目录中输入“bjam”,它可以工作),但我们的实际项目存在问题。

从源代码 (v1.35.0) 构建 boost 库和 bjam,当我运行 bjam 时,我在 bin/gcc-4.1.2/debug 目录中得到一个 .so。我运行 python 和“import”,我得到: ImportError:libboost_python-gcc41-d-1_35.so.1.35.0:无法打开共享对象文件:没有这样的文件或目录

查看库目录,我有以下内容: libboost_python-gcc41-mt-1_35.solibboost_python-gcc41-mt-1_35.so.1.35.0libboost_python-gcc41-mt.so

显然我需要 -d 而不是 -mt 库,或者指向 -mt 库而不是 -d,但我不知道如何让我的 Jamroot 文件这样做。

当我安装 Debian Etch 的库版本时,我得到“/usr/include 中没有 Jamfile” - 并且有一个 debian 错误说他们遗漏了系统级 jamfile。

我更希望从源头上运行它,所以如果有人对解决库问题有任何建议,我很想听听。

对答案 1 的回应:感谢您的提示。那么,你知道我将如何让它使用 MT 库吗?这似乎是 bjam 或我正在使用的 Jamfile 的问题,我认为我处于调试模式,即使我找不到任何标志。虽然我知道如何在对 GCC 的调用中包含特定库,但我看不到从 Boost 端配置它的方法。

【问题讨论】:

【参考方案1】:

如果您还想构建 boost 库的调试变体,则必须使用选项 --build-type=complete 调用 bjam。

在 Debian 上,您可以在 python2.x-dbg 包中获得调试 Python 解释器。 Boost 库的调试版本位于 libboost1.xy-dbg 中,如果您想使用系统 Boost。

【讨论】:

【参考方案2】:

找到了解决方案! Boost 默认构建一个调试版本。键入“bjam release”构建发布配置。 (据我所知,这没有在任何文档中列出。)请注意,这与将构建类型更改为发布不同,因为这不会构建发布配置。按照 Torsten 的建议进行“完整”构建也不会阻止它仅构建调试版本。

还值得注意的是,-d 库位于 <boost-version>/bin.v2/libs/python/build/<gcc version>/debug/ 中,而发布库位于 <gcc-version>/release 中,并没有安装到***“libs”目录。

感谢其他建议!

【讨论】:

【参考方案3】:

有一点很重要:-d 当然是调试,并且应该只链接到您项目的调试版本并且只能与 python 的调试版本一起使用(或者不是,请参见下文)。如果您尝试将调试库链接到非调试版本,或者尝试将调试 pyd 导入非调试 python,则会发生不好的事情。

mt 表示多线程,与 d 正交。您可能想为您的项目使用 mt non-d。

恐怕我不知道如何告诉 gcc 要链接的内容(我一直在使用 Visual Studio)。尝试一件事:

man gcc

应该告诉您如何在链接器上强制使用特定库的地方。

编辑:实际上,您可以将项目的调试版本导入 python 的非调试版本。无论您在哪里包含 python.h,都应包含 boost/python/detail/wrap_python.hpp。

【讨论】:

以上是关于在 Linux 中将 boost-python 与 C++ 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Boost-Python C++ 项目构建,如何使用 Python 中的新库?

boost-python:如何提供自定义构造函数包装函数?

使用 Boost-Python 计算 python 中定义的函数的导数

如何将 kwargs 传递给 boost-python 包装函数?

在 Linux 中将多个 jpg 合并为单个 pdf

Boost python getter/setter 同名