3

我正在尝试(现在几天)使用 boost/python 构建从 C++ 代码生成的 DLL,以供 python 使用。我是一名来自德国的学生,直到现在主要与 Java 有关(我之前用 C++ 编写了一些基本的 OpenGL 和 gimp 过滤器的东西)。所以请提前原谅我英语不好或 C++ 初学者的错误。我的意思是,与 C++ 相比,使用 Java 编程确实要舒服得多。但足够的小规模冲突。

错误:

LINK : fatal error LNK1104: File "boost_python-vc110-mt-gd-1_53.lib" could not be openend

我的预设:

- 使用 MS Visual Studio 2012 (11.0)

- 使用 boost_1_53_0

-使用python2.7(听说3.3可能会出现一些问题)

我做了什么:

安装python并将其添加到PATH。然后在 VS 中创建一个新的空项目和一个类文件“Test.cpp”,其中包含以下内容,如 boost 教程页面所述:

char const* greet()
{
    return "hello world";
}

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(Test)
{
    using namespace boost::python
    def("greet", greet);
}

然后是我的新部分,在 VS Project Properties 中:

配置属性 > 常规 > 配置类型 > 动态库 (.dll)

C/C++ > 常规 > 添加包含目录 > C:[..]\boost_1_53_0

链接器 > 常规 > 其他库目录 > C:[..]boost_1_53_0\stage\lib

从错误中,我假设我对 Linker 或 Include 做错了什么。我还将 Linker > General > Additional Library Directories 更改为 boost_1_53_0\libs 因为我不确定,但发生了同样的错误。是的,我正确地包含了 python。我也不确定是否必须将 python 旁边的其他内容放入 Linker > Input 以进行提升。

然后我用 bjam 构建 boost,除了 msvc-11.0 之外没有其他选项,以确保拥有我需要的一切(尽管我读到 boost/python 不需要额外的构建)并且仍然得到相同的错误。有人能帮我吗?我很想一步一步地描述要做什么。我真的对此感到绝望。

顺便说一句:在Linker error LNK1104 with 'libboost_filesystem-vc100-mt-s-1_49.lib'前几天我和这个人有同样的错误然后停止工作,当我重新开始时,我得到了我的全新错误(我不能告诉你这是怎么发生的)。

4

4 回答 4

4

既然是找静态库,就加BOOST_PYTHON_STATIC_LIBflag,去VS属性->预处理器->处理器定义,加BOOST_PYTHON_STATIC_LIBflag。

于 2015-01-20T10:01:46.283 回答
3

您需要创建一个“user-config.jam”文件,该文件指示 Boost.Build 可以在何处找到 python 头文件和库。您可以在 boost_1_53_0/ 目录中使用以下内容创建它:

# Configure specific Python version.
 using python : 2.7
 : C:/Python27/python.exe
 : C:/Python27/include #directory that contains pyconfig.h
 : C:/Python27/libs    #directory that contains python27.lib
 : <toolset>msvc ;

然后从该 boost_1_53_0/ 目录中,您需要像这样调用 b2 以构建缺少的库:

b2 toolset=msvc-11.0 --with-python variant=debug runtime-debugging=on link=shared --user-config=user-config.jam stage

(尽管我建议b2 toolset=msvc-11.0 --with-python --user-config=user-config.jam --build-type=complete stage您一步完成未来可能需要的所有配置)

拥有库后,您需要将目录添加到 Visual Studio(boost 和 python)。

成功构建模块后,您需要将其重命名为Test.pyd(您在BOOST_PYTHON_MODULE.

import Test
print Test.greet()

并获得熟悉的“hello world”。

于 2013-04-08T17:55:49.960 回答
0

请注意,我非常感谢您的尝试,但您的回答都没有帮助。然后一位同学给了我正确答案的提示,有些步骤真的很容易,有些我不明白,但现在可以了。

第一个问题是:新的 boost 1.53.0 不适用于 Python27 或更早版本。然后我将它与 Python33 链接并删除了构建错误。

但是当然,构建版本没有错误就无法工作。当我尝试启动从 VisualStudio 构建的 .pyd 导入并调用 greet 方法的 helloboost.py 时,出现以下错误:

ImportError: DLL load failed: The specified module could not be found.

当我使用依赖项步行器检查 hello_ext.pyd 并疯狂复制粘贴时,我发现它需要 boost_python-vc110-mt-gd-1_53.dll (可能取决于你需要什么,并且之前用 bjam 构建)在同一个文件夹。那时它奏效了。也许有人可以解释为什么没有地方解释我需要这个dll与pyd在同一个文件夹中(或者我错过了什么?仅仅是因为我之前犯了一个错误?)

无论如何,我很高兴它现在可以工作,并希望它可以帮助其他人。

于 2013-04-23T09:16:55.693 回答
0

您现在可能已经解决了这个问题 - 但是:

当 .exe 查找要加载的 .dll 时,未指定路径。因此 .dll 必须在文件的搜索路径中。

另外:我正在尝试为 Visual Studio 2013 构建 1.49 库 - 并且不断从我的项目中收到 LNK 错误。我不知道谁在 stackoverflow 上提出了建议,但有人\某事让我想到了从最近的提升中复制构建系统的想法,该提升知道如何为最近的环境制作 .libs。(谢谢你)

在 1.58 中运行 bootstrap 后,我必须从 1.58 复制 boost 构建系统,将 b2、bjam 和 boost-build.jam 复制到较早的 boost 文件夹根目录以替换那里的相同命名文件。您还需要复制后面的 tools\build 文件夹以支持构建系统。

在这里指出,希望它可以帮助我发现自己处于类似引用中的其他人。

请参阅:Windows 用于查找 DLL 的搜索路径

于 2015-07-20T06:29:52.447 回答