Я пытаюсь создать расширения, используя библиотеку boost с distutils
в моей установке anaconda (версия 5) (с использованием виртуальной среды).Код MWE от Джеймс Грегсон.
Мой setup.py
равен
from distutils.core import setup, Extension
import sys, glob, os
# define the name of the extension to use
extension_name = 'ExtensionExample'
extension_version = '1.0'
libdir = r'C:\Users\schmmark\Anaconda3\envs\widy640\Library\lib'
# define the directories to search for include files
# to get this to work, you may need to include the path
# to your boost installation. Mine was in
# '/usr/local/include', hence the corresponding entry.
include_dirs = sys.path + [r'C:\Users\schmmark\Anaconda3\envs\widy640\Library\include', 'include',
r'C:\Users\schmmark\Anaconda3\envs\widy640\include']
# define the library directories to include any extra
# libraries that may be needed. The boost::python
# library for me was located in '/usr/local/lib'
library_dirs = [r'C:\Users\schmmark\Anaconda3\envs\widy640\Library\lib']
# define the libraries to link with the boost python library
libraries = ['boost_python37-vc140-mt-x64-1_67']
# define the source files for the extension
source_files = ['src/boost_python_wrapper.cpp', 'src/functions_to_wrap.cpp', 'src/classes_to_wrap.cpp']
# define link arguments
# I change this for testing
# extra_compile_args = ['-DBOOST_ALL_NO_LIB']
# extra_compile_args = ['- -DBOOST_ALL_DYN_LINK']
extra_compile_args = []
# create the extension and add it to the python distribution
setup(name=extension_name, version=extension_version, ext_modules=[
Extension(extension_name, source_files, include_dirs=include_dirs, library_dirs=library_dirs, libraries=libraries,
extra_compile_args=extra_compile_args)])
При такой конфигурации для команды python setup.py build
я получаю ошибку
ССЫЛКА: фатальная ошибка LNK1104: невозможно открыть файл 'boost_pythonPY_MAJOR_VERSIONPY_MINOR_VERSION-vc140-mt-x64-1_67.lib'
, даже если файл boost_python37-vc140-mt-x64-1_67.lib
присутствует впапка C:\Users\schmmark\Anaconda3\envs\widy640\Library\lib
.
Ошибка исчезает при установке extra_compile_args = ['-DBOOST_ALL_NO_LIB']
, но я не хочу импортировать все заголовки вручную.В чем проблема с msvc и boost?
Обновление:
С помощью этот ответ Я изменил в boost/python/detail/config.hpp
строку
#define BOOST_LIB_NAME boost_python##PY_MAJOR_VERSION##PY_MINOR_VERSION
до
#define BOOST_LIB_NAME boost_python37
но затем я получаю ошибки связывания
boost_python_wrapper.obj : error LNK2001: unresolved external symbol "bool __cdecl are_values_equal(int,int)" (?are_values_equal@@YA_NHH@Z)
boost_python_wrapper.obj : error LNK2001: unresolved external symbol "public: int __cdecl wrapped_class::get_value(void)const " (?get_value@wrapped_class@@QEBAHXZ)
boost_python_wrapper.obj : error LNK2001: unresolved external symbol "public: void __cdecl wrapped_class::set_value(int)" (?set_value@wrapped_class@@QEAAXH@Z)
boost_python_wrapper.obj : error LNK2001: unresolved external symbol "public: __cdecl wrapped_class::wrapped_class(void)" (??0wrapped_class@@QEAA@XZ)
boost_python_wrapper.obj : error LNK2001: unresolved external symbol "public: __cdecl wrapped_class::wrapped_class(int)" (??0wrapped_class@@QEAA@H@Z)
boost_python_wrapper.obj : error LNK2001: unresolved external symbol "char const * __cdecl get_string(void)" (?get_string@@YAPEBDXZ)
boost_python_wrapper.obj : error LNK2001: unresolved external symbol "int __cdecl num_arguments(bool,bool,bool,bool)" (?num_arguments@@YAH_N000@Z)
build\lib.win-amd64-3.7\ExtensionExample.cp37-win_amd64.pyd : fatal error LNK1120: 7 unresolved externals