Windows下PyBind11构建Python模块遇LNK2001错误,求.pyd本地安装方法
解决方法:直接用编译好的.pyd文件本地安装,同时修复LNK2001错误
首先明确告诉你:完全可以通过distutils/setuptools直接使用Visual Studio编译好的.pyd文件进行本地安装,同时我也会帮你分析之前LNK2001错误的原因并给出修复方案,两种方式任你选。
方法一:直接打包已编译的.pyd文件
这种方法适合你已经有可用的.pyd文件,不想再折腾编译环节的情况:
1. 整理文件结构
先把你的文件按如下结构摆放:
your-project-folder/ ├── setup.py └── route_search_superfast/ ├── __init__.py └── route_search_superfast.pyd # 你用VS编译好的pyd文件
其中__init__.py可以是空文件,或者添加一行导入代码方便使用:
# route_search_superfast/__init__.py from .route_search_superfast import *
2. 修改setup.py
替换原来的setup.py内容,用setuptools来打包已有的pyd文件(比distutils更灵活,建议使用):
from setuptools import setup, find_packages setup( name='route_search_superfast', version='1.0', description='Python package with superfastcode2 C++ extension (PyBind11)', packages=find_packages(), package_data={ # 指定要打包的pyd文件 'route_search_superfast': ['route_search_superfast.pyd'], }, include_package_data=True, )
3. 执行安装
在setup.py所在目录运行:
pip install .
安装完成后,你就能在Python里正常导入route_search_superfast模块了。
方法二:修复LNK2001错误,让setup.py自动编译
你之前遇到的LNK2001未解析外部符号错误,本质是setup.py只编译了module.cpp,没有包含Environment.cpp等依赖的源文件,导致链接时找不到Environment类的实现。另外你原来的编译参数是针对macOS的,Windows下MSVC编译器不兼容,也要调整:
修改后的setup.py
import os from distutils.core import setup, Extension # 如果你用pip安装了pybind11,可以用这个获取include路径,更可靠 import pybind11 # Windows MSVC的C++编译参数,替换原来的macOS参数 cpp_args = ['/std:c++11'] # 也可以用/std:c++17等更高版本 rss_module = Extension( 'route_search_superfast', # 把所有需要编译的cpp源文件都加进来 sources=['module.cpp', 'Environment.cpp'], # 用pybind11.get_include()自动获取路径,不用手动写 include_dirs=[pybind11.get_include()], language='c++', extra_compile_args=cpp_args, ) setup( name='route_search_superfast', version='1.0', description='Python package with superfastcode2 C++ extension (PyBind11)', ext_modules=[rss_module], )
关键修改点:
- 添加所有依赖源文件:把
Environment.cpp(以及其他用到的cpp文件)加到sources列表里,这样编译时会一起编译链接,解决符号未解析问题。 - 替换编译参数:移除了针对macOS的
-stdlib=libc++和-mmacosx-version-min=10.7,换成Windows MSVC支持的/std:c++11。 - 自动获取pybind11路径:用
pybind11.get_include()代替手动写路径,避免路径错误。
修改完成后,再运行pip install .就能正常编译安装了。
内容的提问来源于stack exchange,提问作者Dyllan M




