在Windows

时间:2015-06-02 23:50:11

标签: python c++ boost visual-studio-2013 scons

我目前正在尝试使用scons构建一个boost :: python模块。我已经设法在Web上找到一些代码片段并将它们拼接在一起,以便在Linux上正确构建。但我在Windows上有一些主要问题(使用Visual Studio 2013编译器)。这是代码:

import distutils.sysconfig, os,sys


def TOOL_BOOST_DISTUTILS(env):    
vars = distutils.sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'BASECFLAGS', 'CCSHARED', 'LDSHARED', 'SO')
for i in range(len(vars)):
    if vars[i] is None:
        vars[i] = ""
(cc, cxx, opt, basecflags, ccshared, ldshared, so_ext) = vars    
env.AppendUnique(CPPPATH=[distutils.sysconfig.get_python_inc(), "D:/boost-vs2013/include/boost-1_57"])

if sys.platform == "win32":
    print "Configuring for Windows" 
    env.AppendUnique(CXXFLAGS=["/MD","/EHsc"])      
else:
    env.AppendUnique(LIBS="boost_python")
    env.AppendUnique(CXXFLAGS =["-std=c++11"])

env['SHLIBSUFFIX']=so_ext
env.AppendUnique(LIBPATH = [distutils.sysconfig.get_python_inc()+"/libs", distutils.sysconfig.PREFIX+"/libs","D:/boost-vs2013/lib"])

Default('.')
env=Environment(tools=['default', TOOL_BOOST_DISTUTILS],TARGET_ARCH = 'x86')
env.SharedLibrary(target='RunGA', source=['RunGA.cpp'])

在构建期间,将创建以下文件:

RunGA.obj

RunGA.pyd

RunGA.exp

RunGA.lib

要导入模块,我需要一个.dll文件而不是.lib,但我不确定如何正确地执行此操作。

编辑04.06.15: 当尝试导入RunGA模块(通过'import RunGA')时,我收到以下错误消息: 'ImportError:DLL加载失败:找不到指定的模块。'

EDIT2 04.06.15:

我设法解决了这个问题。事实证明,项目的目录和系统路径中缺少带有boost python的.dll文件,RunGA.pyd依赖它。谢谢大家的帮助。

2 个答案:

答案 0 :(得分:0)

您正在生成所需的.dll,它刚刚被重命名为.pyd文件。在你的python模块加载它之前,它可能还需要在它的文件名中有一个前导_。您可以通过将以下行附加到SConstruct来获得...

if sys.platform == "win32":
    print "Configuring for Windows" 
    env.AppendUnique(CXXFLAGS=["/MD","/EHsc"])
    env.Replace(LDMODULEPREFIX='_',
                SHLIBPREFIX='_')

您可能看到的构建顺序是从RunGA.obj文件构建RunGA.cpp,然后构建库RunGA.lib,然后RunGA.expRunGA.lib {1}}用于创建RunGA.pyd。也就是说,它正在为您导出.dll,但随后将其重命名为.pyd

这与您在Linux上看到的不同,您最终可能会得到RunGA.oRunGA.py_RunGA.so。在Linux上,动态库需要命名为_MODULE.so,而在Windows上,它需要命名为_MODULE.pyd

答案 1 :(得分:0)

您已经在构建正确的文件,但您的问题表明您不知道如何导入。

有两个步骤。第一个python必须找到并加载dll https://docs.python.org/2/tutorial/modules.html

假设你有“C:\ path \ RunGA.pyd” 和RunGA的依赖关系都在系统路径上

set PYTHONPATH=C:\path
python
>>>import RunGA

然后pyd(实际上是一个dll)必须成功加载。例如,您几乎肯定会有“boost_python {version} .dll”依赖关系。您配置了构建环境以查找它,但它可能不在系统路径上找到任何可执行文件(例如,python,它尝试导入模块,但无法找到其他依赖项)。

http://www.dependencywalker.com/这样的程序非常便于确定加载另一个dll需要哪些dll。