【问题标题】:LNK2001 error when using boost::numpy使用 boost::numpy 时出现 LNK2001 错误
【发布时间】:2017-08-11 11:33:45
【问题描述】:

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

  • Anaconda 2.7 x64
  • Visual Studio 2013 更新 5
  • 为 lib64-msvc-12.0 预构建的 boost 1.63.0

我设法从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的引用,但我只是猜测。

下一步是添加&lt;boost/python/numpy.hpp&gt; 并遵循this 的指示,并从创建numpy::ndarray 开始。是的,我知道 void 与获取值的意图相矛盾,我只是想让事情尽可能简单。

#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;
}

导入和命名空间声明编译没有错误。 在下一步我遇到了链接器错误。虽然 Py_Initialize() 工作正常,但 np::initialize() 导致链接器抛出

错误 LNK2001:无法解析的外部符号“void __cdecl boost::python::numpy::initialize(bool)" (?initialize@numpy@python@boost@@YAX_N@Z)

np::ndarray const example_tuple = np::array(tu) 会导致

错误 LNK2001:无法解析的外部符号“类 boost::python::numpy::ndarray __cdecl boost::python::numpy::array(class boost::python::api::object const &)" (?array@numpy@python@boost@@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>

【问题讨论】:

  • boost build 根据是否执行 python -c "import sys; sys.stderr = sys.stdout; import numpy; print 来决定是否将boost-numpy库构建为boost-python库的一部分(numpy.get_include())" 成功与否。见github.com/boostorg/build/blob/…

标签: python c++ arrays numpy boost


【解决方案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

这两行可能应该包含在boost/python/numpy.hpp 中。遗漏可能是那里的错误。

顺便说一句,这些行可以根据需要重复多次,每次更改定义LIB_BOOST_NAME,以包含任何其他缺少的 Boost 库。 (auto_link.hpp 故意不使用包含保护,因此允许这种类型的使用。)

【讨论】:

  • 像魅力一样工作。对于您的回答,我无法表达我的感激之情!
  • 不幸的是,它并没有解决我的问题。 np::initialize() 在我第一次测试时被注释掉了。
  • @user_na - 您的特定设置可能需要更多配置选项以包含正确的库。您可能还需要#define BOOST_DYN_LINK。或者您可以包含this entire "config.hpp" file 而不仅仅是添加这两行。否则,请注意您遇到的确切错误。我敢打赌他们已经改变了。
  • 所以我开始了一个新项目来跟踪问题,在干净的项目中,我收到一条消息,使用您的附加定义和包含缺少 libboost_numpy-vc120-mt-1_63.lib。并且该库只是没有与预构建版本一起提供。编译它,它现在正在工作。尽管要使其运行,您在答案中的建议仍然是必要的。再次感谢你的帮助。如果可以的话,我会再次投票......
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2021-01-17
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多