gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:15:55 26 4
gpt4 key购买 nike

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

  • python 2.7 x64
  • Visual Studio 2013 更新 5
  • boost 1.63.0 为 lib64-msvc-12.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 的引用在动态构建中,但我只是猜测。

下一步是包括 <boost/python/numpy.hpp>并关注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()导致链接器抛出

error LNK2001: unresolved external symbol "void __cdecl boost::python::numpy::initialize(bool)" (?initialize@numpy@python@boost@@YAX_N@Z)

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

error LNK2001: unresolved external symbol "class 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 build 它。使用此参数:

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_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 有意不使用 include guard,因此允许这种用法。)

关于python - 使用 boost::numpy 时出现 LNK2001 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42899376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com