制作Cython库时如何链接其他c .lib文件
我正在尝试制作一个简单的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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
过了一会儿,我发现了解决方法,您可以运行
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 runpy build.py install
again and it will take what you linked yourself and make it into a working library.