c++ - LNK2019 在 Windows 上使用 Boost python3 和 numpy3 库时 VS2015 中未解析的外部符号

标签 c++ boost boost-python

我已经使用以下命令在 Windows 上下载并构建了 Boost 1.64:

b2 --build-type=complete address-model=64 toolset=msvc stage

我在我的主目录中添加了一个 user-config.jam 文件来告诉 Boost 在哪里可以找到 Python 3:

using python : 3.6 : c:\\anaconda3\\python ;

然后我尝试使用 boost::python 和 boost::numpy 编译一个小型测试项目:

#include <boost/python.hpp>
#include <boost/python/numpy.hpp>

namespace bp = boost::python;
namespace np = boost::python::numpy;

np::ndarray test_make_zeros(int rows, int cols)
{
    return np::zeros(bp::make_tuple(rows, cols), np::dtype::get_builtin<float>());  
}

BOOST_PYTHON_MODULE(test_boost_numpy)
{
    np::initialize();

    bp::def("test_make_zeros", test_make_zeros);
}

我正在使用以下 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.8)
project(test_boost_python)

set(BOOST_ROOT "C:/Boost-1.64")
SET(Boost_ADDITIONAL_VERSIONS 1.64)

find_package(PythonLibs 3.6 REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})

find_package(Boost REQUIRED COMPONENTS python3 numpy3)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

add_library(test_boost_python SHARED test_boost_python.cpp)
set_target_properties(test_boost_python PROPERTIES PREFIX "" SUFFIX ".pyd")
set_target_properties(test_boost_python PROPERTIES DEFINE_SYMBOL "BOOST_ALL_NO_LIB")
target_link_libraries(test_boost_python ${PYTHON_LIBRARIES} ${Boost_LIBRARIES})

我的 boost::python 库被命名为 boost_python3-vc140-mt-1_64.lib 并且 boost::numpy 在链接到 Python 3.6 时最终成为 boost_numpy3-vc140-mt-1_64.lib。

我必须打开 BOOST_ALL_NO_LIB。如果不是,编译器会查找 boost_python-vc140-mt-1_64.lib boost_numpy-vc140-mt-1_64.lib(名称错误,库名称后缺少数字 3)。 (这是 Windows 上的错误吗?)

对于我的测试项目,我现在收到以下链接错误:

test_boost_python.obj : error LNK2019: unresolved external symbol "class boost::python::numpy::dtype __cdecl boost::python::numpy::detail::get_float_dtype<32>(void)" (??$get_float_dtype@$0CA@@detail@numpy@python@boost@@YA?AVdtype@123@XZ) referenced in function "public: static class boost::python::numpy::dtype __cdecl boost::python::numpy::detail::builtin_dtype<float,0>::get(void)" (?get@?$builtin_dtype@M$0A@@detail@numpy@python@boost@@SA?AVdtype@345@XZ)

此符号丢失的原因可能是什么?我应该如何修复它?

最佳答案

这原来是 Boost::Python 中的一个错误,参见问题 #125 并提交 3844c4 .它已在 Boost 的最新开发分支中得到修复。我相信它会在 1.65 版本中得到修复。

关于c++ - LNK2019 在 Windows 上使用 Boost python3 和 numpy3 库时 VS2015 中未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44072440/

相关文章:

c++ - C++中多态对象的二维容器

c++ - 为什么内联以这种方式内联更改汇编代码?

c++ - 设备驱动程序: Windows ReadFile function timeout

c++ - x86 汇编比较参数

c++ - boost::asio 在使用成员接受器而不是新接受器时崩溃

c++ - 我在哪里可以找到一个好的 boost 引用?

c++ - 为 Boost.Python 包含带有 Bjam 的系统库

python - 如何使用 Boost::Python 公开原始字节缓冲区?

c++ - Ubuntu 10.04 中的 Boost.Python 教程

c++ - 嵌套开关替代