Windows上使用cython编译__init__.py文件失败问题解决方法

环境

 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

参考:https://codingdict.com/questions/195889

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值