使用boost :: numpy时出现LNK2001错误

时间:2017-03-20 09:00:51

标签: python c++ arrays numpy boost

我试图从Python调用C ++ .dll并返回一个numpy数组。我正在使用

  • Anaconda 2.7 x64
  • Visual Studio 2013更新5
  • 针对lib64-msvc-12.0预升级1.63.0

我设法编译这个简单的示例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>

1 个答案:

答案 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故意不使用包含警戒,从而允许这种类型的使用。)