【发布时间】:2020-11-20 21:07:55
【问题描述】:
当我在 Windows 上使用 setup.py build_ext --inplace 命令编译任意 __init__.py 文件时,它会出现无法解析的外部符号错误(即“LINK : error LNK2001: An unresolvable external symbol PyInit___init__”)。
当地环境:
python3.7,
Cython 0.29.14,
window10 x64,
Microsoft Visual Studio 2017,
ctest/__init__.py
# cython: language_level=3
print('__init__')
setup.py
from distutils.core import setup
from Cython.Build import cythonize
def compile_code(name, filename):
setup(
name=name,
ext_modules=cythonize(filename),
)
if __name__ == '__main__':
compile_code('a', 'ctest/__init__.py')
终端打印的信息:
Compiling ctest/__init__.py because it changed.
[1/1] Cythonizing ctest/__init__.py
running build_ext
building 'ctest.__init__' extension
creating build
creating build\temp.win-amd64-3.7
creating build\temp.win-amd64-3.7\Release
creating build\temp.win-amd64-3.7\Release\ctest
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Id:\py37\include -Id:\py37\incl
ude "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Pro
gram Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\includ
e\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /Tcctest/__init__
.c /Fobuild\temp.win-amd64-3.7\Release\ctest/__init__.obj
__init__.c
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTU
AC:NO /LIBPATH:d:\py37\Libs /LIBPATH:D:\ENVS\cpytrantest\libs /LIBPATH:D:\ENVS\cpytrantest\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC
\Tools\MSVC\14.16.27023\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\ucrt\x6
4" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x64" /EXPORT:PyInit___init__ build\temp.win-amd64-3.7\Release\ctest/__init__.obj /OUT:C:\Users\76923\Deskto
p\cpythonrecord\ctest\__init__.cp37-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.7\Release\ctest\__init__.cp37-win_amd64.lib
LINK : error LNK2001: An unresolvable external symbol PyInit___init__
build\temp.win-amd64-3.7\Release\ctest\__init__.cp37-win_amd64.lib : fatal error LNK1120: An external command that cannot be parsed
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe' failed with exit status 1120
【问题讨论】:
-
我宁愿不 cythonize/编译 init.py。它似乎可以在 Linux 上运行,但在 Windows 上存在问题。
-
@ead 感谢您的回复。我在 Linux 上执行了相同的命令,它的工作与我希望的一样,但我现在需要在窗口上运行它......
-
这可能很有趣:stackoverflow.com/a/32067984/5769463 暗示它有点意外 - 但应该依赖它吗?但是,
__init__.py并不是真正的模块,那么为什么不让它不编译呢?首先编译它有什么好处? -
我记得看到如果您更改符号可见性(或类似的东西,我不记得细节),您可以使其在 Windows 上工作。不过,这似乎毫无意义
-
@ead 再次感谢。这怎么可能不是一个好的解决方案。_init_.py 文件中只有一点代码,不编译也没关系.也许是因为它在Linux上工作,但在Windows上是一个问题,所以我正在寻找一个解决方案。