将.lib和.h文件转换为可在Python中使用的DLL
因此,我试图将.lib文件中包含的一些函数导入到Python中,以构建一个SDK,使我能够与一些特殊的硬件组件进行对话。我在网上看到,将.lib文件导入Python并不容易: 因此,我尝试使用.lib及其相应的.h文件构建一个dll。我没有访问.lib源代码的权限。我只能访问.h文件。我在网上搜索发现: 因为我正在为Python构建DLL,所以无法使用.def文件。我尝试直接将.h和.lib文件导入到项目中并创建一个dll文件,但函数没有实现。因此,我尝试创建一个名为wrapper的单独的.h文件,它将.h文件中的函数包装起来并调用它们,但这些函数仍然没有实现和工作。老实说,我非常怀疑我所做的是正确的 这是我的密码: hardware.h-与.lib文件一起提供的头文件(注意,只提供一个函数) _h-原始头文件的包装器将.lib和.h文件转换为可在Python中使用的DLL,python,c++,dll,.lib,Python,C++,Dll,.lib,因此,我试图将.lib文件中包含的一些函数导入到Python中,以构建一个SDK,使我能够与一些特殊的硬件组件进行对话。我在网上看到,将.lib文件导入Python并不容易: 因此,我尝试使用.lib及其相应的.h文件构建一个dll。我没有访问.lib源代码的权限。我只能访问.h文件。我在网上搜索发现: 因为我正在为Python构建DLL,所以无法使用.def文件。我尝试直接将.h和.lib文件导入到项目中并创建一个dll文件,但函数没有实现。因此,我尝试创建一个名为wrapper的单独的.
#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]);
};
}
无论如何,我觉得制作一个包装器是毫无意义的,因为我应该能够直接使用原始的.h文件和.lib文件来调用函数。除非制作包装器是我在不获取lib文件源代码的情况下制作dll的唯一方法。有没有办法在不知道库文件源代码的情况下创建dll?有没有办法将lib文件直接导入Python?感谢您的帮助 谢谢@qexyn的帮助。因此,我从包装器(_hardware.h)中取出名称空间和类,并将函数设置为全局函数。然后,我将extern“C”添加到这些全局函数中,因此我的代码最终如下所示: _硬件
#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]);
#pragma一次
#包括
#ifdef硬件导出
#定义硬件API declspec(dllexport)
#否则
#定义硬件API declspec(dllimport)
#恩迪夫
外部“C”硬件\u API int NewGetDigitalOutputInfo(无符号整数设备编号[16]、无符号整数编号[16]、无符号整数编号[16];
在那之后,一切顺利。我能够在我的python SDK中获得硬件信息。确保添加外部“C”,否则名称会被弄乱,如果在dependency walker中查找函数,它会显示得很难看。感谢您的帮助我很确定您将需要使用包装器方法。但是,为了让Python调用到包装器DLL,函数应该是C而不是C++。删除所有名称空间和类语法,只需将全局函数外部化为“C”(就像在与库匹配的头中一样)。将Hardware_API宏保存在其中,并确保在构建DLL时定义了Hardware_导出。@谢谢!因此,我放弃了名称空间和类语法,但当我向全局函数中添加extern“C”时,就像这样:“PlexDO_API extern“C”int DOGetDigitalOutputInfo(无符号整数设备编号[16]、无符号整数编号[16]、无符号整数编号[16]);”这些函数没有被构建,我不能通过Python或C++访问它们。如果我没有外部“C”,我仍然可以使用DLL,而不管我构建了什么C++应用程序,但是Python都不能访问它们。我知道Python使用DLL需要外部“C”。我写错了吗?
#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);
}
}
#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]);