0

I try to build an extensions using the boost library with distutils within my anaconda install (version 5) (using a virtual environment). The code is a MWE from James Gregson.

My setup.py is

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)])

With this configuration, for the command python setup.py build I receive the error

LINK : fatal error LNK1104: cannot open file 'boost_pythonPY_MAJOR_VERSIONPY_MINOR_VERSION-vc140-mt-x64-1_67.lib'

even though the file boost_python37-vc140-mt-x64-1_67.lib is present in the folder C:\Users\schmmark\Anaconda3\envs\widy640\Library\lib.

The error disappears when I set extra_compile_args = ['-DBOOST_ALL_NO_LIB'], but I do not want to import all the headers manually. What is the problem with msvc and boost?

Update:

With the help of this answer I changed in boost/python/detail/config.hpp the line

#define BOOST_LIB_NAME boost_python##PY_MAJOR_VERSION##PY_MINOR_VERSION

to

#define BOOST_LIB_NAME boost_python37

but then I receive linking errors

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
smiddy84
  • 285
  • 1
  • 4
  • 13

1 Answers1

0

I figured both errors out.

  1. LNK1104 error

This seems to be related to the used boost version. At the moment of writing, boost library is version 1.67 in the anaconda distribution. When using the latest v1.69 binaries from the project homepage, the error vanished. When using the v1.67 from the project homepage, the error is still present.

  1. LNK2001 errors

I the mentioned example from James Gregson the cpp files remains empty. If you write actual code compilation is possible, e.g. for functions_to_wrap.cpp

// returns a random string
const char *get_string()
{
   return "hello, world";
};

// returns true if values are equal
bool are_values_equal( int a, int b )
{
   return 0;
};

// returns the number of supplied arguments to demonstrate
// boost::python's default argument overloading features
int num_arguments( bool arg0, bool arg1=false, bool arg2=false, bool arg3=false )
{
   return 0;
};
smiddy84
  • 285
  • 1
  • 4
  • 13