环境
Python:3.8.9
Cython:0.29.23
Windows10
Microsoft Visual Studio 2019
错误信息
building 'my01s_p.__init__' extension
F:\Tools\VS2019\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IF:\Tools\Python3.8.9\include -IF:\Tools\Python3.8.9\include -IF:\Tools\VS2019\VC\Tools\MSVC\14.29.30133\ATLMFC\include -IF:\Too
ls\VS2019\VC\Tools\MSVC\14.29.30133\include "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IF:\Windows Kits\10\include\10.0.19041.0\ucrt" "-IF:\Windows Kits\10\include\10.0.19041.0\shared" "-IF:\Windows Kits\10\
include\10.0.19041.0\um" "-IF:\Windows Kits\10\include\10.0.19041.0\winrt" "-IF:\Windows Kits\10\include\10.0.19041.0\cppwinrt" /Tc./build\my01s_p\__init__.c /Fobuild\temp.win-amd64-3.8\Release\./build\my01s_p\__init__.obj
__init__.c
F:\Tools\VS2019\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:F:\Tools\Python3.8.9\libs /LIBPATH:F:\Tools\Python3.8.9\PCbuild\amd64 /LIBPATH:F:\
Tools\VS2019\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x64 /LIBPATH:F:\Tools\VS2019\VC\Tools\MSVC\14.29.30133\lib\x64 "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" "/LIBPATH:F:\Windows Kits\10\lib\10.0.19041.0\
ucrt\x64" "/LIBPATH:F:\Windows Kits\10\lib\10.0.19041.0\um\x64" /EXPORT:PyInit___init__ build\temp.win-amd64-3.8\Release\./build\my01s_p\__init__.obj /OUT:build\lib.win-amd64-3.8\my01s_p\__init__.pyd /IMPLIB:build\temp.win-amd64-3
.8\Release\./build\my01s_p\__init__.lib
LINK : error LNK2001: unresolved external symbol PyInit___init__
build\temp.win-amd64-3.8\Release\./build\my01s_p\__init__.lib : fatal error LNK1120: 1 unresolved externals
error: command 'F:\\Tools\\VS2019\\VC\\Tools\\MSVC\\14.29.30133\\bin\\HostX86\\x64\\link.exe' failed with exit status 1120
解决方法
方法一
:覆盖get_export_symbols,即将以下内容添加到您的setup.py中(请阅读以获取更简单的版本):
from distutils.command.build_ext import build_ext
def get_export_symbols_fixed(self, ext):
names = ext.name.split('.')
if names[-1] != "__init__":
initfunc_name = "PyInit_" + names[-1]
else:
# take name of the package if it is an __init__-file
initfunc_name = "PyInit_" + names[-2]
if initfunc_name not in ext.export_symbols:
ext.export_symbols.append(initfunc_name)
return ext.export_symbols
# replace wrong version with the fixed:
build_ext.get_export_symbols = get_export_symbols_fixed
方法二
from distutils.command.build_ext import build_ext
def get_export_symbols_fixed(self, ext):
pass # return [] also does the job!
# replace wrong version with the fixed:
build_ext.get_export_symbols = get_export_symbols_fixed