[英]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.exp
和RunGA.lib
用於創建您的RunGA.pyd
。 也就是說,它將為您導出.dll
,然后將其重命名為.pyd
。
這與您在Linux上看到的不同,在Linux上您可能只看到RunGA.o
, RunGA.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.