我正在尝试(几天前)使用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'之前几天和这个家伙有同样的错误然后停止了工作,当我再次开始时,我得到了一个全新的错误(我不能告诉你这是怎么发生的)
答案 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文件夹以支持构建系统。
在这里注意到希望它可以帮助其他类似的人,我发现自己。