处理错误LNK2001:未解析的外部符号\uuu imp__ExitWindowsEx@8在Python扩展中

处理错误LNK2001:未解析的外部符号\uuu imp__ExitWindowsEx@8在Python扩展中,python,c,python-3.x,python-c-api,Python,C,Python 3.x,Python C Api,我正在尝试构建一个C项目。我认为来源是好的,但是我得到了这个错误: 错误LNK2001:未解析的外部符号\uuu imp__ExitWindowsEx@8 或用于完整的回溯: C:\Users\Simon\Desktop\Learn>python setup.py build running build running build_ext building 'sys_shutdown' extension C:\Program Files (x86)\Microsoft Visual St

我正在尝试构建一个C项目。我认为来源是好的,但是我得到了这个错误:

错误LNK2001:未解析的外部符号\uuu imp__ExitWindowsEx@8

或用于完整的回溯:

C:\Users\Simon\Desktop\Learn>python setup.py build
running build
running build_ext
building 'sys_shutdown' extension
C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MT -IC:\Users\Simon\AppData\Local\Programs\Python\Python36-32\include -IC:\Users\Simon\AppData\Local\Programs\Python\Python36-32\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\VC\Tools\MSVC\14.14.26428\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\cppwinrt" /Tcmain.c /Fobuild\temp.win32-3.6\Release\main.obj
main.c
C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\link.exe /nologo /INCREMENTAL:NO /LTCG /nodefaultlib:libucrt.lib ucrt.lib /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\Simon\AppData\Local\Programs\Python\Python36-32\libs /LIBPATH:C:\Users\Simon\AppData\Local\Programs\Python\Python36-32\PCbuild\win32 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\VC\Tools\MSVC\14.14.26428\lib\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.17134.0\ucrt\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.17134.0\um\x86" /EXPORT:PyInit_sys_shutdown build\temp.win32-3.6\Release\main.obj /OUT:build\lib.win32-3.6\sys_shutdown.cp36-win32.pyd /IMPLIB:build\temp.win32-3.6\Release\sys_shutdown.cp36-win32.lib
   Creating library build\temp.win32-3.6\Release\sys_shutdown.cp36-win32.lib and object build\temp.win32-3.6\Release\sys_shutdown.cp36-win32.exp
main.obj : error LNK2001: unresolved external symbol __imp__ExitWindowsEx@8
build\lib.win32-3.6\sys_shutdown.cp36-win32.pyd : fatal error LNK1120: 1 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\WDExpress\\VC\\Tools\\MSVC\\14.14.26428\\bin\\HostX86\\x86\\link.exe' failed with exit status 1120
我从那个
\uu imp__ExitWindowsEx@8
是由于找不到必要的运行时造成的

不要使用#using链接,而是使用linker命令行链接。您可以通过将user32.lib添加到linker命令来实现这一点

我在安装脚本中尝试了以下操作:

我的
main.c
文件(这样您就知道为什么以及我需要链接到什么):

#包括
#包括
/*需要创建的函数*/
静态PyObject*系统关闭(PyObject*自身){
ExitWindowsEx(EWX_断电,SHTDN_原因_次要_其他);//关机
返回Py_BuildValue(“”);
}
静态PyObject*系统重新启动(PyObject*自身){
ExitWindowsEx(EWX_重新启动,SHTDN_原因_次要_其他);//重新启动
返回Py_BuildValue(“”);
}
静态PyObject*sys\u log\u out(PyObject*self){
ExitWinDowsecx(EWX_注销,SHTDN_原因_次要_其他);//注销
返回Py_BuildValue(“”);
}
静态PyMethodDef allMethods[]={
{“sys_shutdown”(PyCFunction)sys_shutdown,METH_NOARGS,“关闭设备”},
{“sys_restart”,(PyCFunction)sys_restart,METH_NOARGS,“重启设备”},
{“sys_log_out”(PyCFunction)sys_log_out,METH_NOARGS,“关闭所有进程并从设备注销用户”},
{NULL,NULL,0,NULL}
};
静态结构PyModuleDef allModule={
PyModuleDef_HEAD_INIT,
“系统功能”,
“系统关闭”,
-1,
所有方法
};
PyMODINIT_FUNC PyInit_系统关闭(无效){
返回PyModule\u创建(&allModule);
}
此扩展需要由
user32.dll提供的
ExitWindowsEx()
函数


如何将
user32.dll
链接到扩展名(或者如果我完全错过了绘图,如何使其正确编译)?

对,我找到了解决方案。已为系统运行时设置链接器路径。我所要做的就是链接运行时本身。这可以使用设置脚本中的
属性来完成:

from distutils.core import setup, Extension

module = Extension(
    "sys_shutdown", 
    sources = ["main.c"],
    libraries = ["user32"] # <-- Here it is
)

setup (
    name = "sys_shutdown",
    version = "1.0",
    ext_modules = [module])
来自distutils.core导入设置,扩展
模块=扩展(
“系统关闭”,
sources=[“main.c”],

libraries=[“user32”]#对,我找到了解决方案。链接器路径已为系统运行时设置。我所要做的就是链接运行时本身。这可以使用安装脚本中的
library
属性来完成:

from distutils.core import setup, Extension

module = Extension(
    "sys_shutdown", 
    sources = ["main.c"],
    libraries = ["user32"] # <-- Here it is
)

setup (
    name = "sys_shutdown",
    version = "1.0",
    ext_modules = [module])
来自distutils.core导入设置,扩展
模块=扩展(
“系统关闭”,
sources=[“main.c”],

libraries=[“user32”]#请注意,如果这不是系统运行时,这是一种使用下面的anwer实现的方法。注意,如果这不是系统运行时,这是一种使用下面的anwer实现的方法
from distutils.core import setup, Extension

module = Extension(
    "sys_shutdown", 
    sources = ["main.c"],
    libraries = ["user32"] # <-- Here it is
)

setup (
    name = "sys_shutdown",
    version = "1.0",
    ext_modules = [module])