配置Visual Studio以与Boost.Python和Python 3一起使用

4
我有Microsoft Visual Studio Community 2013 (版本12.0.31101.00 更新4)和Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017)安装在我的Windows 10 Pro电脑上。为了尝试使用Boost.Python的示例,我下载了boost 1.64.0并使用选项--with-python --toolset=msvc --build-type=complete通过b2构建库。结果我有以下文件:
  • boost_python3-vc120-mt-1_64.dll
  • boost_python3-vc120-mt-1_64.lib
  • boost_python3-vc120-mt-gd-1_64.dll
  • boost_python3-vc120-mt-gd-1_64.lib
  • libboost_python3-vc120-mt-1_64.lib
  • libboost_python3-vc120-mt-gd-1_64.lib
  • libboost_python3-vc120-mt-s-1_64.lib
  • libboost_python3-vc120-mt-sgd-1_64.lib
  • libboost_python3-vc120-s-1_64.lib
  • libboost_python3-vc120-sgd-1_64.lib

然后我在Visual Studio中创建了一个项目(类型:Win32 / DLL),使用了这里的以下代码:

char const* greet()
{
    return "hello, world";
}

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello)
{
    using namespace boost::python;
    def("greet", greet);
}

在C/C++设置的项目属性中,我添加了“附加包含目录”到Boost和Python的位置(以\ Python36 \ include结尾)。
在第一次尝试构建项目时出现错误:
错误1 error LNK1104:无法打开文件'python36.lib'
因此,在链接器设置的项目属性中,“附加库目录”,我添加了相应的位置(以\ Python \ Python36 \ libs结尾)。之后我可以继续...到下一个错误:
错误1 error LNK1104:无法打开文件'boost_python-vc120-mt-gd-1_64.lib'
值得注意的是,我拥有的文件名与VS2013寻找的文件名之间的区别仅是单词python之后的数字3。

stackoverflowgoogle groups上讨论了类似的问题,但没有提供有价值的技巧。唯一有用的信息是库文件名*boost_python-*对应Python 2,*boost_python3-*对应Python 3。

我注意到将构建类型(解决方案配置)从Debug更改为Release会导致库文件名称的一部分中的错误消息发生变化(现在没有`-gd-`):

错误1 错误 LNK1104: 无法打开文件“boost_python-vc120-mt-1_64.lib”

我猜想,VS2013知道Boost库的文件名约定,但可能不知道Python 2和Python 3之间的区别。

所以,我有三个问题:

  1. 是否有可能影响VS查找Boost.Python库时使用的逻辑?(当然,重命名lib文件也是一种选择,但出于某些原因,我不喜欢这样做)
  2. 链接器选项是否允许直接指定lib文件?(例如,在“附加库目录”部分中,我可以编写整个路径到boost_python3-vc120-mt-1_64.lib,包括文件名,而不仅仅是文件夹名称)
  3. 项目属性中的哪个选项应该使VS2013使用不同的LIB或DLL文件,例如libboost_python3-vc120-mt-1_64.libboost_python3-vc120-mt-1_64.dll,而不是boost_python-vc120-mt-1_64.lib

你的C++包含路径中是否有Python2相关的内容,这可能会在构建应用程序时导致找到错误的Python.h文件。 - Kenny Ostrom
@KennyOstrom 我的电脑上没有安装Python 2,所以 Python.h 只能从 ...\Python\Python36\include\ 获取。也许我的代码中应该添加一些 #define。 - VolAnd
1
在 boost/python/detail/config.hpp 文件中是否有 "#define BOOST_LIB_NAME boost_python"?在构建 boost 之前,您是否将 python3 设置放入 config_user.jam 中?看起来它知道它是 python3,但 auto_link.hpp 的信息是错误的? - Kenny Ostrom
我建议使用Nuget软件包,https://www.nuget.org/packages/boost-vc120/ - T33C
由于历史原因,我仍在使用Python2。你可以尝试一下,但我不知道为什么它正在构建一个库并设置auto_link以加载错误的名称。顺便说一句,你可以忽略发布/调试的事情,因为-gd-只是他们说“这是调试版本”的方式(auto_link做对了)。 - Kenny Ostrom
显示剩余4条评论
1个回答

2

在社区的帮助下,我已经找到了几个问题的答案。

  1. 是否有可能影响VS用于查找Boost.Python库的逻辑?

库的名称取决于文件boost/python/detail/config.hpp中定义的宏BOOST_LIB_NAME的值。 我尝试更改了第108行(在boost 1.64.0中)。

#define BOOST_LIB_NAME boost_python

为了

#define BOOST_LIB_NAME boost_python3

可行的库文件从boost_python-vc120-mt-1_64.lib更改为boost_python3-vc120-mt-1_64.lib

需要注意的是,可以创建auto_link.hpp并重新定义BOOST_LIB_NAME,而不是在config.hpp文件中更改值。

  1. 项目属性中的哪个选项应使VS2013使用不同的LIB或DLL文件,例如libboost_python3-vc120-mt-1_64.libboost_python3-vc120-mt-1_64.dll,而不是boost_python-vc120-mt-1_64.lib

这也是由定义控制的。

特别是,在我的代码开头(#include <boost/python.hpp>之前)添加以下行:

#define BOOST_PYTHON_STATIC_LIB

强制 MSVS 搜索文件 libboost_python3-vc120-mt-1_64.lib(或 libboost_python-vc120-mt-1_64.lib),即静态库。

反之,该行的作用是:

#define BOOST_PYTHON_DYNAMIC_LIB

或者

#define BOOST_ALL_DYN_LINK

可以用来从动态链接库中导入代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接