如何用pybind11正确编译C++代码?VS2017配置及编译产物疑问
解决pybind11 + VS + Anaconda 模块导入问题
首先明确核心问题:你需要生成的是DLL文件(Windows下要重命名为.pyd),而不是.obj文件。.obj只是编译过程中的中间产物,Python完全无法识别它作为模块导入。
接下来针对你的VS+Anaconda环境,补充这些关键配置步骤:
1. 把VS项目改成动态链接库(DLL)类型
你当前的项目可能是控制台或其他类型,需要调整:
- 右键项目 → 属性 → 配置属性 → 常规 → 项目默认值 → 配置类型,选择「动态库(.dll)」
2. 绑定Anaconda环境的Python头文件和库
因为你用的是独立的Anaconda环境,VS默认不会识别它,得手动指定路径:
- 包含目录:添加Anaconda环境下的
include文件夹,比如C:\Users\你的用户名\anaconda3\envs\你的环境名\include - 库目录:添加Anaconda环境下的
libs文件夹,比如C:\Users\你的用户名\anaconda3\envs\你的环境名\libs(里面有对应版本的pythonXX.lib,比如Python3.10就是python310.lib)
3. 配置链接器依赖
- 右键项目 → 属性 → 配置属性 → 链接器 → 输入 → 附加依赖项,添加对应的
pythonXX.lib(比如python310.lib),确保版本和你的Anaconda环境完全匹配
4. 输出文件改为.pyd格式
Windows下Python的扩展模块要求后缀是.pyd(本质是特殊的DLL):
- 方法一:编译完成后手动把生成的
example.dll改名为example.pyd - 方法二:在VS里直接设置输出名:配置属性 → 链接器 → 常规 → 输出文件,修改为
$(OutDir)\example.pyd
5. 确认架构完全匹配
你已经设置了x64,要确保你的Anaconda环境也是64位的:
- 打开Anaconda Prompt,激活你的环境后输入:
返回python -c "import sys; print(sys.maxsize > 2**32)"True就是64位,和你的VS编译架构一致才可以正常导入
6. 确保模块在Python搜索路径中
把生成的example.pyd放到Python能找到的位置:
- 最简单的方法是放到Anaconda环境的
site-packages文件夹里 - 或者在Python脚本里临时添加路径:
import sys sys.path.append("你的pyd文件所在的绝对路径") import example
额外注意事项
- 保持用Release模式编译:Debug模式的Python库和Release不兼容,你当前的选择是对的
- 确保pybind11的版本和Python版本兼容,尽量使用最新版的pybind11
- 如果遇到链接错误,检查pybind11的头文件路径是否正确添加,或者Python库的路径有没有写错
内容的提问来源于stack exchange,提问作者aditya sista
相关产品推荐
相关产品推荐

