【发布时间】: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。
stackoverflow 和google 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 个问题:
- 是否可以影响 VS 查找 Boost.Python 库的逻辑? (当然 lib-files 重命名也是一种选择,但出于某种原因我不喜欢这样)
- 链接器选项是否允许直接指定 lib 文件? (即我可以写到
boost_python3-vc120-mt-1_64.lib的完整路径,包括文件名,而不仅仅是“附加库目录”部分中的文件夹名称) - 项目属性中的哪些选项应该使 VS2013 使用不同的 LIB 或 DLL 文件,例如
libboost_python3-vc120-mt-1_64.lib或boost_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>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