Конвертируйте файл.lib и.h в DLL, которую можно использовать в Python
Поэтому я пытаюсь импортировать некоторую функцию, содержащуюся в файле.lib, в Python для создания SDK, который позволит мне общаться с некоторыми специальными аппаратными компонентами. Я прочитал в Интернете, что импортировать файл.lib в Python не так-то просто:
Статическая библиотека (.lib) для проекта Python
Поэтому я пытаюсь построить DLL, используя.lib и соответствующий ему файл.h. У меня нет доступа к исходному коду.lib. Все, что у меня есть, - это файл.h. Я посмотрел онлайн и нашел это:
Преобразование статической библиотеки ссылок в динамическую DLL
Поскольку я собираю DLL для Python, я не могу использовать файл.def. Я попытался напрямую импортировать файлы.h и.lib в проект и создать файл dll, но функции не были реализованы. Поэтому я попытался создать отдельный файл.h с именем wrapper, который оборачивает функции в файле.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 без получения исходного кода файла lib. Есть ли способы сделать DLL, не зная исходного кода файла lib? Есть ли способ импортировать файл lib прямо в Python? Любая помощь приветствуется.
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", иначе имена будут искажены, и это будет выглядеть ужасно, если вы посмотрите свою функцию в обходчике зависимостей. Спасибо за помощь