将.lib和.h文件转换为可在Python中使用的DLL

Convert a .lib and .h file to a DLL that can be used in Python

本文关键字:Python DLL lib 文件 转换      更新时间:2023-10-16

所以我试图将.lib文件中包含的一些函数导入Python以构建一个SDK,该SDK允许我与一些特殊的硬件组件进行通信。我在网上看到,将.lib文件导入Python并不容易:

静态库(.lib)到Python项目

所以我试图使用。lib及其相应的。h文件构建一个dll。我无法访问.lib源代码。我能看到的只有。h文件。我在网上看了看,发现了这个:

将静态链接库转换为动态dll

因为我正在为Python构建DLL,所以我不能使用.def文件。我尝试直接导入。h和。lib文件到一个项目,并创建一个dll文件,但功能没有实现。因此,我尝试制作一个单独的.h文件,称为包装器,包装。h文件中的函数并调用它们,但函数仍然没有实现和工作。老实说,我非常怀疑我所做的是正确的

下面是我的代码:

hardware.h - .lib文件附带的头文件(注意只放了一个函数)

extern "C" int WINAPI GetDigitalOutputInfo(unsigned int deviceNumbers[16], 
                                            unsigned int numBits[16], 
                                            unsigned int numLines[16]);

_hardware.h -原始头文件的包装器

#pragma once
#include <Windows.h>
#ifdef Hardware_EXPORTS
#define Hardware_API __declspec(dllexport) 
#else
#define Hardware_API __declspec(dllimport) 
#endif
namespace Hardware
{
    class Functions
    {
        public:
            static Hardware_API int NewGetDigitalOutputInfo(unsigned int deviceNumbers[16], unsigned int numBits[16], unsigned int numLines[16]);
    };
}

Hardware.cpp -实现包装器

#include "stdafx.h"
#include "hardware.h"
#include "_hardware.h"
#pragma comment(lib, "..\lib\PlexDO.lib")
#pragma comment(lib, "legacy_stdio_definitions.lib")
namespace Hardware
{
    int Functions::NewGetDigitalOutputInfo(unsigned int deviceNumbers[16], unsigned int numBits[16], unsigned int numLines[16]) {
        return GetDigitalOutputInfo(deviceNumbers, numBits, numLines);
    }
}

无论如何,我觉得制作包装器是毫无意义的,因为我应该能够直接使用原始的。h文件和。lib文件来调用函数。除非使包装是唯一的方法,我可以使一个dll没有得到库文件的源代码。有没有办法使一个dll不知道库文件的源代码?是否有方法将lib文件直接导入Python?任何帮助都是感激的。

谢谢@qexyn的帮助。因此,我从包装器(_hardware.h)中取出名称空间和类,并使这些函数成为全局函数。然后我在这些全局函数中添加了外部"C",所以我的代码最终看起来像这样:

_hardware.h

#pragma once
#include <Windows.h>
#ifdef Hardware_EXPORTS
#define Hardware_API __declspec(dllexport) 
#else
#define Hardware_API __declspec(dllimport) 
#endif
extern "C" Hardware_API int NewGetDigitalOutputInfo(unsigned int deviceNumbers[16], unsigned int numBits[16], unsigned int numLines[16]);

之后一切正常。我可以在python SDK中获取硬件信息。确保添加外部"C",否则名称会混乱,如果你在依赖项查找器中查找你的函数,它会显示得很难看。谢谢你的帮助