提升1.53 python致命错误LNK1104 boost_python-vc110-mt-gd-1_53.lib

时间:2013-04-08 14:29:06

标签: c++ python boost visual-studio-2012

我正在尝试(几天前)使用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”,其中包含以下内容,如增强教程页面所述:

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

#include <boost/python.hpp>

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

然后在VS项目属性中找到了我的新部分:

配置属性&gt;一般&gt;配置类型&gt;动态库(.dll)

C / C ++&gt;一般&gt;附加包含的内容&gt; C:[..] \ boost_1_53_0

链接器&gt;一般&gt;其他图书馆目录&gt; C:[..] boost_1_53_0 \阶段\ lib中

从错误中我假设我做错了Linker或Include。我也改变了Linker&gt;一般&gt;其他库目录为boost_1_53_0 \ libs,因为我不确定,但发生了同样的错误。是的,我正确地包含了python。我也不确定我是否必须在python旁边放一些东西到Linker&gt;输入提升。

然后我使用bjam构建boost,除了msvc-11.0之外没有任何选项,以确保拥有我需要的一切(虽然我读到boost / python不需要额外的构建)并且仍然得到相同的错误。有人能帮我吗?我希望能够逐步说明该怎么做。我真的绝望了。

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

4 个答案:

答案 0 :(得分:4)

由于它正在寻找静态库,请添加BOOST_PYTHON_STATIC_LIB标志,转到VS属性 - &gt;预处理器 - &gt;处理器定义,添加BOOST_PYTHON_STATIC_LIB标志。

答案 1 :(得分: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中使用的确切名称。如果您的PATH或当前文件中包含python和Boost.Python库目录,您将能够使用教程中的脚本:

import Test
print Test.greet()

并获得熟悉的“hello world”。

答案 2 :(得分:0)

请注意,我非常感谢您的尝试,但您的答案都没有帮助。然后一位同学给了我正确答案的提示,一些步骤非常简单,有些我不明白,但它现在有效。

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

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

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

当我使用依赖walker检查hello_ext.pyd并粘贴时,我发现它需要boost_python-vc110-mt-gd-1_53.dll(可能取决于你需要的内容并且之前使用bjam构建)在同一个文件夹中。它起作用了。也许有人可以解释为什么没有人解释我在pyd所在的文件夹中需要这个dll(或者我错过了什么?是不是因为我之前犯了错误?)

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

答案 3 :(得分: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文件夹以支持构建系统。

在这里注意到希望它可以帮助其他类似的人,我发现自己。

请参阅:Search Path Used by Windows to Locate a DLL