vs2019 pybind11 生成linux可以使用的扩展库

本文介绍了如何利用Visual Studio 2019和pybind11在Windows环境下创建一个适用于Linux的Python扩展库。主要步骤包括在Linux上下载pybind11头文件,安装Python相关工具,在Windows下配置VS2019工程,设置包含路径、输出文件格式,并确保生成的库能在Linux环境中正确运行。

    pybind11 扩展库非常强大,如何用vs2019生成工程,这样就可以避免使用cmake来在linux上边生成工程文件了。

     A. linux 上边的工作

  •      下载pybind11 只要下载不需要编译,网上很我文章要编译,实际上只要里边的头文件就可以,根本不需要编译,我就下载到了 ~/pybind11 目录下边了
  •       pip install pytest
  •       anaconda3 安装 python3.8

    B. windows 下边的操作

     1.  vs2019 生成  linux 工程,我的工程名是 pybind11Test。

     2.  增加pybind11Test.cpp

#include <cstdio>

#include <pybind11/pybind11.h>

int add(int i, int j) {
	return i + j;
}

PYBIND11_MODULE(pybind11Test, m) {
	m.doc() = "pybind11 example plugin"; // optional module docstring
	m.def("add", &add, "A function which adds two numbers");
	m.def("foo", []() {
		return "Hello, World!";
	});
}

   这里的pybind11Test 要和工程名一样,不能随便改,否则后边引入模块后找不到里边的方法。

    3.

vc++ 目录里边增加 

/home/yangzm/pybind11/include      

/home/yangzm/anaconda3/include/python3.8

常规

目标文件: 由lib$(ProjectName) 改成  $(ProjectName)    

动态库(.so)  动态库(.so)

链接

输出文件:  $(TargetDir)$(ProjectName).cpython-38-x86_64-linux-gnu.so 

其中.cpython-38-x86_64-linux-gnu.so 是用 python -c "from distutils import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))" 在linux下边生成的

附加目录:/home/yangzm/anaconda3/lib/

输入-》依赖库-》python3.8

 4. 把生成的库copy 到linux 机器上边的 

/home/yangzm/anaconda3/lib/python3.8/site-packages  下边,这里可以自动加载

5. 在linux下边测试:

     import pybind11Test

     pybind11Test.foo()

 

可以了,成功! 

<think>我们正在回答用户关于如何在VS2019中安装pybind11的问题。根据引用资料,我们可以总结出以下步骤: 引用[1]提到pybind11是一个只有头文件的库,所以主要是配置头文件路径。 引用[4]提到了使用CMake配置VS工程的方法,但用户可能更关心直接配置VS项目的方法。 引用[5]详细说明了在VS2019中配置一个项目来使用pybind11的步骤,包括设置项目类型、包含目录、库目录以及链接器输入。 因此,我们将重点介绍在VS2019中创建一个pybind11项目(用于生成Python扩展)的步骤。 步骤: 1. 下载pybind11:从GitHub下载源码(https://github.com/pybind/pybind11) 2. 解压到本地目录,例如:D:\pybind11 3. 在VS2019中创建新项目: - 选择“动态链接库(DLL)”项目(注意:最终我们要生成.pyd扩展名的文件) - 项目创建后,进行配置: 4. 配置项目属性: a) 配置属性 -> 常规: - 配置类型:动态库(.dll) - 目标文件扩展名:.pyd (这是Python扩展模块的扩展名) b) 配置属性 -> VC++目录 -> 包含目录: - 添加Python的include目录(例如:C:\ProgramData\Anaconda3\include 或你Python安装目录下的include) - 添加pybind11的include目录(例如:D:\pybind11\include) c) 配置属性 -> VC++目录 -> 库目录: - 添加Python的libs目录(例如:C:\ProgramData\Anaconda3\libs) d) 配置属性 -> 链接器 -> 输入 -> 附加依赖项: - 添加Python的库文件,例如:python37.lib(具体版本根据你的Python版本而定,比如Python3.8就是python38.lib) - 注意:在Release和Debug配置下可能需要不同的库(例如Debug版本可能需要python38_d.lib,但通常Anaconda不提供调试库) e) 注意:如果是Debug配置,可能需要确保Python的库有对应的调试版本,否则建议使用Release配置。 5. 编写代码:创建一个源文件(如example.cpp),编写绑定代码(参考引用[3]的示例): ```cpp #include <pybind11/pybind11.h> int add(int i, int j) { return i + j; } PYBIND11_MODULE(example, m) { m.doc() = "pybind11 example plugin"; m.def("add", &add, "A function that adds two numbers"); } ``` 6. 编译:生成解决方案,得到example.pyd文件。 7. 在Python中使用: ```python import example print(example.add(1, 2)) # 输出3 ``` 注意事项: - 确保编译时使用的Python环境(版本和架构)与运行时一致(例如都是64位或都是32位)。 - 如果使用Anaconda,注意VS中的平台工具集(Platform Toolset)要与Anaconda的Python版本兼容(一般使用较新的工具集,如VS2019默认的v142)。 替代方法:使用CMake(如引用[4]所述)可以更自动化的配置,但这里用户要求的是VS2019中的方法。 另外,引用[2]提到在Linux下只需要头文件,同样在Windows下我们也不需要编译pybind11本身,只需要包含它的头文件。 下面我们按照要求组织答案,包括格式和数学表达式(虽然这个问题不涉及数学,但如果有公式的地方要按规则写)。 </think>### VS2019中安装配置pybind11的详细步骤 #### 1. 安装准备 - **环境要求** - Visual Studio 2019(安装时勾选"使用C++的桌面开发")[^5] - Python环境(推荐Anaconda 3.8+版本)[^1] - 下载pybind11源码:[官方GitHub仓库](https://github.com/pybind/pybind11) #### 2. 源码配置(CMake方法) ```bash # 在pybind11源码目录中创建构建目录 mkdir build && cd build # 配置VS2019解决方案(指定Python解释器路径) cmake .. -G "Visual Studio 16 2019" -A x64 -DPYTHON_EXECUTABLE=C:/Anaconda3/python.exe # 生成VS项目文件 cmake --build . --config Release ``` > 此方法会生成包含头文件的`install`目录供后续使用[^4] #### 3. 手动配置VS项目(推荐) 1. **创建新项目** - 选择"动态链接库(DLL)"模板 - 修改项目属性: ```ini 配置属性 > 常规 > 目标文件扩展名 = .pyd 配置属性 > 高级 > 目标文件扩展名 = .pyd ``` 2. **配置包含目录** 添加以下路径[^5]: ``` C:\ProgramData\Anaconda3\include # Python头文件 D:\pybind11\include # pybind11头文件 ``` 3. **配置库目录** ``` C:\ProgramData\Anaconda3\libs # Python库文件 ``` 4. **链接器设置** ``` 附加依赖项添加: python38.lib (根据Python版本) ``` #### 4. 验证安装(示例代码) 创建`example.cpp`: ```cpp #include <pybind11/pybind11.h> namespace py = pybind11; int add(int i, int j) { return i + j; // $ f(x,y) = x + y $ } PYBIND11_MODULE(example, m) { m.def("add", &add, "加法函数"); } ``` 编译后生成`example.pyd`文件 #### 5. Python端测试 ```python import example print(example.add(3, 5)) # 输出8 ``` ### 常见问题解决 - **LNK1104错误** 检查Python库版本是否匹配(32/64位一致性) - **未找到Python.h** 确认包含目录路径正确(Anaconda路径可能为`C:\Users\<user>\Anaconda3\include`) - **导入模块失败** 将生成的.pyd文件放在Python可导入路径下 > **关键提示** > - 推荐使用x64平台编译(匹配现代Python发行版) > - Debug模式下需链接`python38_d.lib`(需编译调试版Python) > - 通过`py::scoped_interpreter`管理Python生命周期[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值