使用boost::numpy时发生LNK2001错误 我试图从Python调用C++ .dll,并返回一个NUMPY数组。我正在使用 巨蟒2.7 x64 Visual Studio 2013更新5 为lib64-msvc-12.0预先构建的boost 1.63.0

使用boost::numpy时发生LNK2001错误 我试图从Python调用C++ .dll,并返回一个NUMPY数组。我正在使用 巨蟒2.7 x64 Visual Studio 2013更新5 为lib64-msvc-12.0预先构建的boost 1.63.0,python,c++,arrays,numpy,boost,Python,C++,Arrays,Numpy,Boost,我成功地从E编译了这个简单的示例,并在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",

我成功地从E编译了这个简单的示例,并在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);
}
导入和命名空间声明编译时不会出错。 在下一步中,我遇到了链接器错误。虽然Py_Initialize()工作正常,但是
np::Initialize()
会导致链接器抛出

错误LNK2001:未解析的外部符号“void\uu cdecl” boost::python::numpy::初始化(bool)” (?initialize@numpy@python@boost@@雅克斯_N@Z)

np::ndarray const示例\u tuple=np::array(tu)
导致

错误LNK2001:未解析的外部符号“类” boost::python::numpy::ndarray\uu cdecl boost::python::numpy::array(类boost::python::api::object const&) (?array@numpy@python@boost@@是吗?AVndarray@123@AEBVobject@api@23@@Z)

由于链接器对第一个示例非常满意,我对这里发生的事情感到非常困惑。我还试图注释掉第一个示例中的所有部分,只编译第二个部分,而不改变任何行为

任何关于如何让我的链接器快乐的提示都是非常感谢的

[更新-问题已解决] 事实证明,错误的来源只是boost的probuild版本没有libboost\u numpy-vc120-mt-1\u 63.lib,所以我按照说明构建了它。使用此参数:

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_PYTHON_STATIC_LIB
#定义BOOST_LIB_名称“BOOST_numpy”
#包括
#包括

所需的库不会像其他boost组件那样被boost\u numpy自动拉入。要解决此问题,请将以下行放在一个源文件中:

#define BOOST_LIB_NAME "boost_numpy"
#include <boost/config/auto_link.hpp>
#定义BOOST_LIB_名称“BOOST_numpy”
#包括
这将使用Boost的自动链接功能为您的构建配置(如
libboost\u numpy-vc120-mt-1_63.lib
)确定合适的
Boost\u numpy
库,并生成一个
#pragma
,要求链接器包含它

这两行代码可能应该包含在
boost/python/numpy.hpp
中。遗漏可能是一个错误


顺便说一句,这些行可以根据需要重复多次,每次更改定义
LIB\u BOOST\u NAME
,以包括任何其他缺少的BOOST库。(
auto_link.hpp
故意不使用include-guard,因此允许这种类型的使用。)

像charm一样工作。我无法对你的回答表示感谢!不幸的是,它并没有解决我的问题。np::initialize()在我第一次测试时被注释掉了。@user\n-也许您需要更多的配置选项来包含正确的库。您可能还需要定义BOOST\u DYN\u LINK。或者您可以包括这两行,而不仅仅是添加这两行。否则,请注意您得到的确切错误。我敢打赌他们已经改变了。所以我启动了一个新项目来跟踪这个问题,在clean项目中,我收到一条消息,使用您的附加定义和包含,libboost_numpy-vc120-mt-1_63.lib丢失了。而lib只是没有与预构建版本一起交付。我编译了它,现在正在运行。不过,你在答案中的建议仍然是必要的,以使其得以实施。再次感谢你的帮助。如果可以,我会再次投票…Boost build根据执行python-c“import sys;sys.stderr=sys.stdout;import numpy;print(numpy.get_include())是否成功来决定是否将Boost numpy库构建为Boost python库的一部分。看见
#define BOOST_LIB_NAME "boost_numpy"
#include <boost/config/auto_link.hpp>