【问题标题】:Configuring Visual Studio to work with Boost.Python and Python 3配置 Visual Studio 以使用 Boost.Python 和 Python 3
【发布时间】:2017-07-08 14:36:34
【问题描述】:

我在装有 Windows 10 Pro 的 PC 上安装了 Microsoft Visual Studio Community 2013(版本 12.0.31101.00 Update 4)和 Python 3.6.1(v3.6.1:69c0db5,2017 年 3 月 21 日)。

为了尝试使用 Boost.Python 的示例,我下载了 boost 1.64.0 并通过 b2 使用选项 --with-python --toolset=msvc --build-type=complete 构建库。结果我有以下文件:

  • 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),代码如下here

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错误LNK1104:无法打开文件'python36.lib'

所以在链接器设置“附加库目录”的项目属性中,我添加了相应的位置(以 \Python\Python36\libs 结尾)。之后,我可以继续...到下一个错误:

错误1错误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 的区别。

所以,我有 3 个问题:

  1. 是否可以影响 VS 查找 Boost.Python 库的逻辑? (当然 lib-files 重命名也是一种选择,但出于某种原因我不喜欢这样)
  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?
  • @KennyOstrom 我的电脑上没有安装 Python 2,所以 Python.h 只能从 ...\Python\Python36\include\ 中获取。也许应该在我的代码中添加一些#define
  • 在 boost/python/detail/config.hpp 中是否有“#define BOOST_LIB_NAME boost_python”?在构建 boost 之前,您是否将 python3 设置放在 config_user.jam 中?好像知道是python3,但是auto_link.hpp信息不对?
  • @KennyOstrom File user-config.jam 与using python : 3.6 : ... : define&gt;BOOST_ALL_NO_LIB=1 ; 之类的内容一起使用。在 config.hpp 中定义真的是#define BOOST_LIB_NAME boost_python(应该在这里更改BOOST_LIB_NAME 的值吗?或者应该找到/创建 auto_link.hpp 以更改库名称?)
  • 我推荐使用 Nuget 包,nuget.org/packages/boost-vc120

标签: c++ python-3.x visual-studio-2013 boost-python


【解决方案1】:

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

  1. 是否可以影响 VS 查找 Boost.Python 库的逻辑?

库的名称取决于文件boost/python/detail/config.hpp 中定义为宏BOOST_LIB_NAME 的值。 我试图改变线路(升压 1.64.0 中的 108)

#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

需要注意的是,可以通过重新定义BOOST_LIB_NAME 来创建和使用auto_link.hpp 文件中的值,而不是更改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 &lt;boost/python.hpp&gt; 之前)添加一行

#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

可用于从 dll 导入代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2011-07-04
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多