预先的软件信息:
MSVC 2008 / 9.0(我的公司很难放手)
提升1.64
Python 2.7(真的很难放弃)
我们正在为一个程序转换一个DLL模块,使其能够运行可以与该模块接口的Python脚本,因此我一直在连接Boost.Python。我按照教程制作了一个非常简单的示例:
using namespace boost::python;
BOOST_PYTHON_MODULE(PythonModule)
{
class_<CPythonModule, boost::noncopyable>("PythonModule")
.def("foo", &CPythonModule::foo)
;
}
(编辑:我在这里使用的不可复制性可能是不正确的;我们有一个将运行python脚本的对象的实例,并且需要进行编译以消除私有函数错误)
还有一个甚至更简单的Python脚本,它除了导入外什么都不做:
import PythonModule
所有编译完成,运行脚本...导入失败。了解到我必须将DLL文件扩展名切换为.pyd,然后再次运行它,遇到了稍微不同的错误:
ImportError: DLL load failed: The specified module could not be found.
我无法使这个消失。我在脚本旁边的运行目录中包含了Boost DLL,没有骰子。从我所看到的,它实际上是在找到.pyd,但是之后又出了点问题。我已经确定的事情:
C ++的“附加包含”包括指向“ python27 \ includes”和“ boost_1_64_0”的路径。
链接器“附加库”目录包含指向“ Python27 \ libs”和“ boost_1_64_0 \ lib32-msvc-9.0”的路径。
在尝试消除SO帖子中的错误的过程中,我也继续尝试将它们添加到Linker的其他依赖项中:
C:\local\boost_1_64_0\lib32-msvc-9.0\boost_python-vc90-mt-1_64.lib
C:\local\boost_1_64_0\lib32-msvc-9.0\boost_python-vc90-mt-gd-1_64.lib
C:\local\boost_1_64_0\lib32-msvc-9.0\libboost_python-vc90-mt-1_64.lib
C:\local\boost_1_64_0\lib32-msvc-9.0\libboost_python-vc90-mt-gd-1_64.lib
我的环境路径还包括Boost,Python,甚至是我尝试从中运行脚本的特定目录。
答案 0 :(得分:0)
确保BOOST_PYTHON_MODULE()
中提供的名称与二进制名称匹配。因此,对于BOOST_PYTHON_MODULE(PythonModule)
,二进制名称应为PythonModule.pyd
。还要将二进制模块和测试脚本放在同一文件夹中。
如果这不起作用,请使用Process Monitor和Dependency Walker找出正在发生的事情。例如,可能与您系统中安装的其他python dll发生冲突,该DLL出现在PATH上的版本早于您希望使用的版本。或者由于某种原因,无法加载python dll或任何其他必需的dll。等等。这实际上可以是任何东西,您需要自己进行调查。