我试图从Python调用C ++ .dll并返回一个numpy数组。我正在使用
我设法编译这个简单的示例frome here并在Python中运行它:
#include "stdafx.h"
#define BOOST_PYTHON_STATIC_LIB
#include <boost/python.hpp>
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(test)
{
using namespace boost::python;
def("greet", greet);
}
我不确定#define BOOST_PYTHON_STATIC_LIB
但没有它python无法打开pyd文件。我怀疑python无法在动态构建中解析对MSVCR120.dll
的引用,但我只是在猜测。
下一步是要包含<boost/python/numpy.hpp>
并遵循this指令,然后从创建numpy::ndarray
开始。是的,我知道虚空与获取价值的意图相矛盾,我只是想让事情变得尽可能简单。
#include <boost/python/numpy.hpp>
namespace p = boost::python;
namespace np = boost::python::numpy;
void getNPArray()
{
Py_Initialize();
np::initialize();
p::object tu = p::make_tuple('a', 'b', 'c');
np::ndarray const example_tuple = np::array(tu);
return;
}
import和namespace声明编译时没有错误。
在下一步,我遇到了链接器错误。虽然Py_Initialize()工作正常,但np::initialize()
会导致链接器抛出
错误LNK2001:未解析的外部符号“void __cdecl 提高::蟒蛇:: numpy的初始化::(布尔)” (?初始化@numpy @ python @ boost @@ YAX_N @ Z)
np::ndarray const example_tuple = np::array(tu)
会导致
错误LNK2001:未解析的外部符号“类 boost :: python :: numpy :: ndarray __cdecl boost :: python :: numpy :: array(类boost :: python :: api :: object const&amp;)“ (?阵列@ numpy的@蟒@ @@升压YA?AVndarray @ 123 @ AEBVobject @ API @ 23 @@ Z)
由于链接器对第一个例子非常满意,我对这里发生的事情感到困惑。我还尝试注释掉第一个例子中的所有部分,然后编译第二部分,没有任何行为变化。
有关如何让我的链接器感到满意的任何提示都非常感谢。
[更新 - 问题已解决]
事实证明,错误的来源只是boost的probuild版本没有libboost_numpy-vc120-mt-1_63.lib
所以我按照指令here来构建它。使用此参数:
b2 -j8 --toolset=msvc-12.0 release link=static runtime-link=static address-model=64 --build-type=complete stage --with-python
现在为我工作的导入如下:
#define BOOST_PYTHON_STATIC_LIB
#define BOOST_LIB_NAME "boost_numpy"
#include <boost/config/auto_link.hpp>
#include <boost/python/numpy.hpp>
答案 0 :(得分:1)
所需的库不会被boost_numpy
自动拉入,就像其他Boost组件一样。要解决此问题,请将这些行放在一个源文件中:
#define BOOST_LIB_NAME "boost_numpy"
#include <boost/config/auto_link.hpp>
这将使用Boost的自动链接功能为您的构建配置确定适当的boost_numpy
库(例如libboost_numpy-vc120-mt-1_63.lib
),并生成一个#pragma
,要求您的链接器包含它。< / p>
这两行可能应该包含在boost/python/numpy.hpp
中。遗漏可能是那里的一个错误。
顺便说一句,这些行可以根据需要重复多次,每次都更改定义LIB_BOOST_NAME
,以包含任何其他缺少的Boost库。 (auto_link.hpp
故意不使用包含警戒,从而允许这种类型的使用。)