制作Cython库时如何链接其他c .lib文件

发布于 2025-02-10 08:25:55 字数 4566 浏览 2 评论 0原文

我正在尝试制作一个简单的python库,该库调用logonuser,以查看提供的明文密码是否与提供的用户名密码匹配,但是当我编译时,它给了我这个错误

passcheck.obj:error lnk2001:未解决的外部符号__imp_logonusera

完整日志:

running build
running build_ext
building 'passcheck' extension
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\memol\AppData\Local\Programs\Python\Python38\include -IC:\Users\memol\AppData\Local\Programs\Python\Python38\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\cppwinrt" /Tcpasscheck.c /Fobuild\temp.win-amd64-3.8\Release\passcheck.obj
passcheck.c
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\memol\AppData\Local\Programs\Python\Python38\libs /LIBPATH:C:\Users\memol\AppData\Local\Programs\Python\Python38\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\ATLMFC\lib\x64" "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64" /EXPORT:PyInit_passcheck build\temp.win-amd64-3.8\Release\passcheck.obj /OUT:build\lib.win-amd64-3.8\passcheck.cp38-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.8\Release\passcheck.cp38-win_amd64.lib
   Creating library build\temp.win-amd64-3.8\Release\passcheck.cp38-win_amd64.lib and object build\temp.win-amd64-3.8\Release\passcheck.cp38-win_amd64.exp
passcheck.obj : error LNK2001: unresolved external symbol __imp_LogonUserA
build\lib.win-amd64-3.8\passcheck.cp38-win_amd64.pyd : fatal error LNK1120: 1 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30037\\bin\\HostX86\\x64\\link.exe' failed with exit status 1120

查看 this 我已经来了我需要链接库文件“ advapi32.lib”的结论,但是查看帮助我找不到任何方法来完成该问题中提供的解决方案,并尝试自己运行命令,但给我带来了错误链接:致命错误lnk1158:无法运行'rc.exe',另外,我不确定如果该命令有效并将其放入python库,则该如何处理它所编译的内容。

完整代码:

#include <Python.h>
#include <windows.h>
#include <winbase.h>

static PyObject* method_passcheck(PyObject* self, PyObject* args) {
    LPCSTR username;
    LPCSTR password;
    LPCSTR star = "*";
    //int bytes_copied = -1;

    /* Parse arguments */
    if (!PyArg_ParseTuple(args, "ss", &username, &password)) {
        return NULL;
    }

    PHANDLE hToken;


    int passwordWorked = LogonUserA(username, star, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, hToken);

    //FILE* fp = fopen(filename, "w");
    //bytes_copied = fputs(str, fp);
    //fclose(fp);

    return PyLong_FromLong(passwordWorked);
}
static PyMethodDef PasscheckMethods[] = {
    {"passcheck", method_passcheck, METH_VARARGS, "Python interface for fputs C library function"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef passcheck = {
    PyModuleDef_HEAD_INIT,
    "passcheck",
    "Python interface for the fputs C library function",
    -1,
    PasscheckMethods
};

PyMODINIT_FUNC PyInit_passcheck(void) {
    return PyModule_Create(&passcheck);
}

和我的设置.py:

from setuptools import setup, Extension

def main():
    setup(name="passcheck",
          version="1.0.0",
          description="Python interface for the Win32 api's RunAs function to test if a string matches a users password.",
          author="no one",
          ext_modules=[Extension("passcheck", ["passcheck.c"])])

if __name__ == "__main__":
    main()

I am attempting to make a simple python library that calls LogonUser to see if the plaintext password provided matches the password of the username provided, but when I compile, it gives me this error

passcheck.obj : error LNK2001: unresolved external symbol __imp_LogonUserA

full log:

running build
running build_ext
building 'passcheck' extension
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\memol\AppData\Local\Programs\Python\Python38\include -IC:\Users\memol\AppData\Local\Programs\Python\Python38\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\cppwinrt" /Tcpasscheck.c /Fobuild\temp.win-amd64-3.8\Release\passcheck.obj
passcheck.c
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\memol\AppData\Local\Programs\Python\Python38\libs /LIBPATH:C:\Users\memol\AppData\Local\Programs\Python\Python38\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\ATLMFC\lib\x64" "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64" /EXPORT:PyInit_passcheck build\temp.win-amd64-3.8\Release\passcheck.obj /OUT:build\lib.win-amd64-3.8\passcheck.cp38-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.8\Release\passcheck.cp38-win_amd64.lib
   Creating library build\temp.win-amd64-3.8\Release\passcheck.cp38-win_amd64.lib and object build\temp.win-amd64-3.8\Release\passcheck.cp38-win_amd64.exp
passcheck.obj : error LNK2001: unresolved external symbol __imp_LogonUserA
build\lib.win-amd64-3.8\passcheck.cp38-win_amd64.pyd : fatal error LNK1120: 1 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30037\\bin\\HostX86\\x64\\link.exe' failed with exit status 1120

After looking at this I have come to the conclusion I need to link the library file "advapi32.lib", However looking at the help I cannot find any way to do the solution provided in that question with command arguments, and attempting to run the command myself works but gives me the error LINK : fatal error LNK1158: cannot run 'rc.exe', and plus I'm not sure how to take what it compiles if that command worked and make it into a python library.

FULL CODE:

#include <Python.h>
#include <windows.h>
#include <winbase.h>

static PyObject* method_passcheck(PyObject* self, PyObject* args) {
    LPCSTR username;
    LPCSTR password;
    LPCSTR star = "*";
    //int bytes_copied = -1;

    /* Parse arguments */
    if (!PyArg_ParseTuple(args, "ss", &username, &password)) {
        return NULL;
    }

    PHANDLE hToken;


    int passwordWorked = LogonUserA(username, star, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, hToken);

    //FILE* fp = fopen(filename, "w");
    //bytes_copied = fputs(str, fp);
    //fclose(fp);

    return PyLong_FromLong(passwordWorked);
}
static PyMethodDef PasscheckMethods[] = {
    {"passcheck", method_passcheck, METH_VARARGS, "Python interface for fputs C library function"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef passcheck = {
    PyModuleDef_HEAD_INIT,
    "passcheck",
    "Python interface for the fputs C library function",
    -1,
    PasscheckMethods
};

PyMODINIT_FUNC PyInit_passcheck(void) {
    return PyModule_Create(&passcheck);
}

and my setup.py:

from setuptools import setup, Extension

def main():
    setup(name="passcheck",
          version="1.0.0",
          description="Python interface for the Win32 api's RunAs function to test if a string matches a users password.",
          author="no one",
          ext_modules=[Extension("passcheck", ["passcheck.c"])])

if __name__ == "__main__":
    main()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浪漫人生路 2025-02-17 08:25:55

过了一会儿,我发现了解决方法,您可以运行py build.py install等待链接器运行并复制链接命令,然后在字符串中添加logonusera的logonusera, 。之后,您可以再次运行py build.py install,它将带您链接到自己并将其置于工作库中。

After a while I figured out a workaround, you can run py build.py install wait until linker runs and copy the command for linker, then add the file with LogonUserA At the end of the command in a string. After this you can run py build.py install again and it will take what you linked yourself and make it into a working library.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文