Python的包装DLL:“致命错误LNK1127:库已损坏”

2024-10-03 17:23:11 发布

您现在位置:Python中文网/ 问答频道 /正文

简要说明

我有一个在ADA中用GNAT编写的DLL。我想用MSVC编译另一个C中的DLL作为ADA_DLL的包装器,以便与Python一起使用。在

我已经编译了ada_DLL,然后根据gnat documentation about MSVC生成了.lib文件。最后,我尝试用Visual Studio编译C\U DLL,得到错误:

libmath.lib : fatal error LNK1127: library is corrupt

更新:在@Brian建议使用gcc编译的情况下,我得到以下输出:

^{pr2}$

我尝试的东西和更多数据:

我已经尝试过用Python中的ctypes直接导入ADA_DLL,它可以工作,因此我相信ADA_DLL编译正确。另外,忘记C\u DLL并不是一个真正的选择。在

我用division示例模块做了一个小例子。我的.def文件类似于:

; dlltool -z libmath.def --export-all-symbols libmath.dll
EXPORTS
   [...]
    div @ 259
   [...]

libmath公司:

#include "libmath_c.h"
    PyObject* _wrap_DIVISION(PyObject *self, PyObject *args){
       div(10, 2);
       return Py_None;
    }
    __declspec(dllexport) void __cdecl initDIVISION_CPP(void){
       Py_InitModule("DIVISION_CPP", LIB_METHODS_methods);
      }

libmath公司:

#include <windows.h>
#include <stdio.h>
#include <Python.h>
PyObject* _wrap_DIVISION(PyObject *self, PyObject *args);
static PyMethodDef LIB_METHODS_methods[] = {
   { "CPP_DIVISION", _wrap_DIVISION, METH_VARARGS },
   {NULL, NULL, 0, NULL}   //Added as indicated by @Brian. Thanks! 
};
__declspec(dllexport) void __cdecl initDIVISION_CPP(void);

你知道发生了什么吗?任何帮助都将不胜感激。谢谢!在


Tags: 文件includelibdefnullcppdivisionpyobject
2条回答

序言:如果这是一个没有答案的道歉;我希望能够回到这个问题,并找到链接,评论往往腐烂。。。在

首先,gcc(在版本匹配Gnat中)可以作为一个替代的C编译器工作,如果是这样,它可以消除与不兼容的库版本的困难。在

GCC可用于生成Windows dll,因此结果应该可以从其他Windows可执行文件使用。在

下面的注释;gcc看起来确实允许编译,但结果目前无法从Python中使用-在这里,我对Python的了解很浅,而且我们没有MCVE,因此这是推测性的:

This Q&A addresses the same error message在Python和纯C之间,没有Ada,这表明这个错误可能不是C包装的Ada特有的。在

你已经绕过了提问者的具体错误

static PyMethodDef* _npfindmethods = { ... };

它使用了一个指针;您正在(根据答案正确地)静态分配一个数组。但是,接受的答案会终止方法列表

^{pr2}$

使用NULL方法;您的示例不会:

static PyMethodDef LIB_METHODS_methods[] = {
   { "CPP_DIVISION", _wrap_DIVISION, METH_VARARGS }
};

所以我的假设是,当你在这个模块上运行setup()时,它会成功地找到CPP_除法,然后在没有空方法的情况下,它会陷入混乱,产生相同的症状,尽管原因不同。在

我可以用MCVE来测试这个假设,方法是删除NULL方法;但是我手头没有Windows系统,只有Linux。在

或者,我认为没有理由使用C层。如果没有C层,this Q&A addresses direct interaction between Python and Ada没有C层,尽管它似乎使用了不同的方法,getattr()来导入外部方法。可能是另一种选择?在

最后,我设法用gcc+gnat编译,但没有用MSVC+gnat编译。在

用gcc+gnat,我得到了//libmath.lib库:添加符号时出错:存档格式不正确。解决办法在于使用libmath.dll而不是从.dll生成.lib。在

因此,总而言之:

  • 如果有一个由gnat生成的.dll,请将其与gcc一起使用。你不需要建立一个.lib。在
  • 如果有一个.lib(例如python27.lib)或不是由gnat生成的.dll,请使用类似“pexport”的工具将其转换为.a(不要使用SED!)。在
  • 如果你真的需要用MSVC编译。。。抱歉,我没办法。你的公主在另一座城堡里。在

相关问题 更多 >