如何在setup.py中引入已编译OpenSSL 3.0文件解决LNK2001链接错误
问题原因
LNK2001错误是链接器未找到OpenSSL对应的导出符号,你的原有配置没有将OpenSSL的静态导入库加入链接依赖,同时存在路径配置错误、打包规则配置错误的问题。
可行解决方案
1. 修正Extension链接配置
你需要在Extension参数中显式指定OpenSSL的库搜索路径和要链接的导入库:
- 删除include_dirs中无用的lib、bin路径,仅保留头文件目录
- 新增
library_dirs参数指定OpenSSL lib文件所在路径 - 新增
libraries参数指定要链接的libcrypto、libssl导入库
2. 修正DLL打包配置
原有package_data配置格式错误,且不会自动将DLL放到运行时可加载的路径,改用data_files参数指定安装时将DLL直接放到site-packages目录,适配无网环境直接使用。
3. 修正路径笔误
原有配置中存在./crypto/Openss/的拼写错误(少写了一个l),需要修正路径,删除重复的lib文件配置。
修改后完整setup.py代码
from distutils.core import setup, Extension setup( name='test', version='1.0', # 指定安装时将openssl dll复制到site-packages根目录 data_files = [ ('Lib/site-packages', [ r"./crypto/Openssl/bin/libssl-3.dll", r"./crypto/Openssl/bin/libcrypto-3.dll" ]) ], description='test', # 仅保留头文件目录 include_dirs = [r'./crypto/Openssl/include'], ext_modules=[ Extension( "test", sources=[r'./example/example_main.cpp'], # 指定lib搜索路径 library_dirs = [r'./crypto/Openssl/lib'], # 指定要链接的openssl导入库 libraries = ['libcrypto', 'libssl'] ) ] )
编译注意事项
由于你使用的是32位Python + 32位编译的OpenSSL,在64位PowerShell中执行编译时,需要强制指定32位平台编译,执行命令:python setup.py install --plat-name=win32
编译完成后可直接在无网环境安装生成的包,OpenSSL的DLL会被自动打包到安装目录,无需额外安装OpenSSL。
内容的提问来源于stack exchange,提问作者user10731525
相关产品推荐
相关产品推荐

