Итак, я пытаюсь импортировать некоторую функцию, содержащуюся в .lib-файле, в Python для создания SDK, который позволит мне поговорить с некоторыми специальными аппаратных компонентов. Я читал в Интернете, что это не очень легко импортировать файл .lib в Python:Преобразование файлов .lib и .h в DLL, которые могут быть использованы в Python
Static library (.lib) to Python project
Так что я пытаюсь создать библиотеку DLL, используя .lib и соответствующий файл .h. У меня нет доступа к исходному коду .lib. У меня есть доступ к файлу .h. Я посмотрел в Интернете и нашел это:
Converting static link library to dynamic dll
Так как я строить DLL для Python Я не могу использовать 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 без получения исходного кода файла lib. Есть ли способы сделать dll, не зная исходный код файла lib? Есть ли способ импортировать файл lib непосредственно в Python? Любая помощь приветствуется.
Im довольно уверен, что вам нужно будет использовать обертку. Однако для того, чтобы Python заходил в вашу DLL-оболочку, функции должны быть C вместо C++. Отбросьте все синтаксис пространства имен и классов и просто внесите «C» ваши глобальные функции (как в заголовке, соответствующем lib). Сохраните макрос Hardware_API и убедитесь, что Hardware_EXPORTS определен при создании библиотеки DLL. – qexyn
@qexyn Спасибо! Поэтому я отказался от синтаксиса пространства имен и классов, но когда добавляю extern «C» к моим глобальным функциям следующим образом: «PlexDO_API extern» C »int DOGetDigitalOutputInfo (unsigned int deviceNumbers [16], unsigned int numBits [16], unsigned int numLines [16]);» функции не построены, и я не могу получить к ним доступ через Python или C++.если у меня нет extern «C», я все еще могу использовать dll с любым C++-приложением, которое я создаю, но Python не может получить к ним доступ. Я знаю, что extern «C» требуется для того, чтобы Python мог использовать DLL. Я пишу это неправильно? – halochief996