安装boost.numpy时编译出错
出错为builtin_float_dtype<128>未定义,该函数出现在boost.numpy/libs/src/dtype.cpp中:
#if NPY_BITSOF_LONGDOUBLE > NPY_BITSOF_DOUBLE
template <> struct builtin_float_dtype< NPY_BITSOF_LONGDOUBLE > {
static dtype get() { return DTYPE_FROM_CODE(NPY_LONGDOUBLE); }
};
template dtype get_float_dtype< NPY_BITSOF_LONGDOUBLE >();
template <> struct builtin_complex_dtype< 2 * NPY_BITSOF_LONGDOUBLE > {
static dtype get() { return DTYPE_FROM_CODE(NPY_CLONGDOUBLE); }
};
template dtype get_complex_dtype< 2 * NPY_BITSOF_LONGDOUBLE >();
#endif
由于numpy将NPY_BITSOF_LONGDOUBLE 和NPY_BITSOF_DOUBLE定义为相同长度,所以没有创建该函数,但在test/dtype_mod.cpp中出现了:
// floats and complex
p::def("accept_float32", accept);
p::def("accept_complex64", accept< std::complex >);
p::def("accept_float64", accept);
p::def("accept_complex128", accept< std::complex >);
if (sizeof(long double) > sizeof(double)) {
p::def("accept_longdouble", accept);
p::def("accept_clongdouble", accept< std::complex >);
}
可将它注销掉:
// floats and complex
p::def("accept_float32", accept);
p::def("accept_complex64", accept< std::complex >);
p::def("accept_float64", accept);
p::def("accept_complex128", accept< std::complex >);
/*if (sizeof(long double) > sizeof(double)) {
p::def("accept_longdouble", accept);
p::def("accept_clongdouble", accept< std::complex >);
}*/
利用cmake编译boost.numpy时将LIBRARY_TYPE设置为SHARED,注意必须为大写
如何利用boot.python和boost.numpy编译文件?
(1) 创建boost-build.jam
内容:
boost-build "d:/boost_1_59_0/tools/build/src" ;
上面路径对应boost的tools库
(2) 创建Jamroot文件
内容:
# Copyright David Abrahams 2006. Distributed under the Boost
# Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
import python ;
if ! [ python.configured ]
{
ECHO "notice: no Python configured in user-config.jam" ;
ECHO "notice: will use default configuration" ;
using python ;
}
# Specify the path to the Boost project. If you move this project,
# adjust this path to refer to the Boost root directory.
use-project boost
: D:/boost_1_59_0/ ;
lib boost_numpy : : boost_numpy . ;
# Set up the project-wide requirements that everything uses the
# boost_python library from the project whose global ID is
# /boost/python.
project
: requirements /boost/python//boost_python
boost_numpy
/boost//headers
: usage-requirements /boost//headers
;
# Declare the three extension modules. You can specify multiple
# source files after the colon separated by spaces.
python-extension wakeModel : main.cpp wakeModel.cpp ;
# Put the extension and Boost.Python DLL in the current directory, so
# that running script by hand works.
install convenient_copy
: wakeModel
: on SHARED_LIB PYTHON_EXTENSION
.
;
# A little "rule" (function) to clean up the syntax of declaring tests
# of these extension modules.
local rule run-test ( test-name : sources + )
{
import testing ;
testing.make-test run-pyd : $(sources) : : $(test-name) ;
}
# Declare test targets
#run-test wakeModel : wakeModel_ext wakeModel.py ;
(3) 运行命令:
bjam toolset=gcc release threading=multi
(4) 将libboost_python-mgw51-mt-1_59.dll和libboost_numpy.dll拷贝到当前目录,注意libboost_numpy.dll的依赖库要与libboost_python-mgw51-mt1_59.dll同名