首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >处理错误LNK2001: Python扩展中未解析的外部符号__imp__ExitWindowsEx@8

处理错误LNK2001: Python扩展中未解析的外部符号__imp__ExitWindowsEx@8
EN

Stack Overflow用户
提问于 2018-06-14 04:26:41
回答 1查看 1.3K关注 0票数 0

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

错误LNK2001:未解析的外部符号__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

我从here中了解到,__imp__ExitWindowsEx@8是由于未找到必要的运行时而导致的。

不要使用#using but link使用链接器命令行链接。您可以通过将user32.lib添加到链接器命令来完成此操作

我使用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文件(这样您就知道我为什么需要链接以及我需要链接到什么):

#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()函数

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-14 04:34:17

好的,我找到了解决方案。已为系统运行时设置链接器路径。我所要做的就是链接运行时本身。这可以使用设置脚本中的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])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50845740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档