簡體   English   中英

在Windows下使用SCons構建boost :: python模塊

[英]Building boost::python module with SCons under Windows

我目前正在嘗試使用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

運行GA.pyd

RunGA.exp

運行GA.lib

要導入模塊,我需要一個.dll文件而不是.lib文件,但我不確定如何正確執行此操作。

編輯04.06.15:嘗試導入RunGA模塊(通過“導入RunGA”)時,出現以下錯誤消息:“ ImportError:DLL加載失敗:找不到指定的模塊。”

EDIT2 04.06.15:

我設法解決了這個問題。 原來,項目目錄和系統路徑中缺少帶有boost python的.dll文件,RunGA.pyd依賴於此文件。 謝謝大家的幫助。

您正在生成所需的.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用於創建您的RunGA.pyd 也就是說,它將為您導出.dll ,然后將其重命名為.pyd

這與您在Linux上看到的不同,在Linux上您可能只看到RunGA.oRunGA.py_RunGA.so 在Linux上,動態庫需要命名為_MODULE.so ,而在Windows上,則需要命名為_MODULE.pyd

您已經在構建正確的文件,但是您的問題表明您不知道如何導入。

有兩個步驟。 第一個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”依賴性。 您配置了build env來查找它,但是它可能不在系統路徑上找不到任何可執行文件(例如python,它嘗試導入模塊,但找不到其其他依賴項)。

http://www.dependencywalker.com/這樣的程序對於確定加載另一個dll所需的dll非常方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM