处理错误 LNK2001:Python 扩展中未解析的外部符号 __imp__ExitWindowsEx@8
Dealing with error LNK2001: unresolved external symbol __imp__ExitWindowsEx@8 in Python extensions
我正在尝试构建一个 C 项目。我认为来源很好,但我收到此错误:
error LNK2001: unresolved external symbol __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 Studio17\WDExpress\VC\Tools\MSVC.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 Studio17\WDExpress\VC\Tools\MSVC.14.26428\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK.6.1\include\um" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\shared" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\um" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\winrt" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\cppwinrt" /Tcmain.c /Fobuild\temp.win32-3.6\Release\main.obj
main.c
C:\Program Files (x86)\Microsoft Visual Studio17\WDExpress\VC\Tools\MSVC.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 Studio17\WDExpress\VC\Tools\MSVC.14.26428\lib\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK.6.1\lib\um\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.0.17134.0\ucrt\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.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
我从here中得出__imp__ExitWindowsEx@8
是由于没有找到必要的运行时造成的。
Don't link using the #using but link using the linker command line. You can do that by adding the user32.lib to the linker command
我在我的设置脚本中使用 extra_objects
:
尝试了这个
import setup, Extension
module = Extension(
"sys_shutdown",
sources = ["main.c"],
extra_objects = ["C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17134.0\um\arm64\User32.Lib"]
)
setup (
name = "sys_shutdown",
version = "1.0",
ext_modules = [module])
我的 main.c
文件(所以你知道为什么以及我需要 link 做什么):
#include <Python.h>
#include <Windows.h>
/* The functions that need to be created */
static PyObject * sys_shutdown(PyObject *self) {
ExitWindowsEx(EWX_POWEROFF, SHTDN_REASON_MINOR_OTHER); // Shutdown
return Py_BuildValue("");
}
static PyObject * sys_restart(PyObject *self) {
ExitWindowsEx(EWX_REBOOT, SHTDN_REASON_MINOR_OTHER); // Restart
return Py_BuildValue("");
}
static PyObject * sys_log_out(PyObject *self) {
ExitWindowsEx(EWX_LOGOFF, SHTDN_REASON_MINOR_OTHER); // Log out
return Py_BuildValue("");
}
static PyMethodDef allMethods[] = {
{"sys_shutdown", (PyCFunction)sys_shutdown, METH_NOARGS, "Shuts down the device"},
{"sys_restart", (PyCFunction)sys_restart, METH_NOARGS, "Restarts the device"},
{"sys_log_out", (PyCFunction)sys_log_out, METH_NOARGS, "Closes all processes and logs out the user from the device"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef allModule = {
PyModuleDef_HEAD_INIT,
"System Functions",
"sys_shutdown",
-1,
allMethods
};
PyMODINIT_FUNC PyInit_sys_shutdown(void) {
return PyModule_Create(&allModule);
}
此扩展需要 user32.dll
提供的 ExitWindowsEx()
功能
我怎样才能 link 我的扩展 user32.dll
(或者如果我完全错过了情节,我怎样才能让它正确编译)?
是的,我找到了解决方案。 linker 路径已经为系统运行时设置。我所要做的就是 link 运行时本身。这可以使用设置脚本中的 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])
我正在尝试构建一个 C 项目。我认为来源很好,但我收到此错误:
error LNK2001: unresolved external symbol __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 Studio17\WDExpress\VC\Tools\MSVC.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 Studio17\WDExpress\VC\Tools\MSVC.14.26428\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK.6.1\include\um" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\shared" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\um" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\winrt" "-IC:\Program Files (x86)\Windows Kits\include.0.17134.0\cppwinrt" /Tcmain.c /Fobuild\temp.win32-3.6\Release\main.obj
main.c
C:\Program Files (x86)\Microsoft Visual Studio17\WDExpress\VC\Tools\MSVC.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 Studio17\WDExpress\VC\Tools\MSVC.14.26428\lib\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK.6.1\lib\um\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.0.17134.0\ucrt\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.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
我从here中得出__imp__ExitWindowsEx@8
是由于没有找到必要的运行时造成的。
Don't link using the #using but link using the linker command line. You can do that by adding the user32.lib to the linker command
我在我的设置脚本中使用 extra_objects
:
import setup, Extension
module = Extension(
"sys_shutdown",
sources = ["main.c"],
extra_objects = ["C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17134.0\um\arm64\User32.Lib"]
)
setup (
name = "sys_shutdown",
version = "1.0",
ext_modules = [module])
我的 main.c
文件(所以你知道为什么以及我需要 link 做什么):
#include <Python.h>
#include <Windows.h>
/* The functions that need to be created */
static PyObject * sys_shutdown(PyObject *self) {
ExitWindowsEx(EWX_POWEROFF, SHTDN_REASON_MINOR_OTHER); // Shutdown
return Py_BuildValue("");
}
static PyObject * sys_restart(PyObject *self) {
ExitWindowsEx(EWX_REBOOT, SHTDN_REASON_MINOR_OTHER); // Restart
return Py_BuildValue("");
}
static PyObject * sys_log_out(PyObject *self) {
ExitWindowsEx(EWX_LOGOFF, SHTDN_REASON_MINOR_OTHER); // Log out
return Py_BuildValue("");
}
static PyMethodDef allMethods[] = {
{"sys_shutdown", (PyCFunction)sys_shutdown, METH_NOARGS, "Shuts down the device"},
{"sys_restart", (PyCFunction)sys_restart, METH_NOARGS, "Restarts the device"},
{"sys_log_out", (PyCFunction)sys_log_out, METH_NOARGS, "Closes all processes and logs out the user from the device"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef allModule = {
PyModuleDef_HEAD_INIT,
"System Functions",
"sys_shutdown",
-1,
allMethods
};
PyMODINIT_FUNC PyInit_sys_shutdown(void) {
return PyModule_Create(&allModule);
}
此扩展需要 user32.dll
ExitWindowsEx()
功能
我怎样才能 link 我的扩展 user32.dll
(或者如果我完全错过了情节,我怎样才能让它正确编译)?
是的,我找到了解决方案。 linker 路径已经为系统运行时设置。我所要做的就是 link 运行时本身。这可以使用设置脚本中的 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])