将.lib和.h文件转换为可在Python

时间:2016-10-27 21:46:48

标签: python c++ dll .lib

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

Static library (.lib) to Python project

所以我尝试使用.lib及其相应的.h文件构建一个dll。我无法访问.lib源代码。我有权访问的是.h文件。我已经在网上找到了这个:

Converting static link library to dynamic dll

由于我正在为Python构建DLL,因此我无法使用.def文件。我试着直接将.h和.lib文件导入到项目中并创建一个dll文件但是没有实现这些功能。所以我尝试创建一个名为wrapper的独立.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文件来调用这些函数。除非创建一个包装器是我可以在没有获取lib文件源代码的情况下制作dll的唯一方法。有没有办法在不知道lib文件源代码的情况下创建一个DLL?有没有办法将lib文件直接导入Python?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

谢谢@qexyn的帮助。所以我从包装器(_hardware.h)中取出了命名空间和类,并使函数全局化。然后我将extern“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中获取硬件信息。确保添加extern“C”否则名称会被破坏,如果你在依赖walker中查找你的函数,它会显得很难看。谢谢你的帮助