2016-10-27 2 views
1

Итак, я пытаюсь импортировать некоторую функцию, содержащуюся в .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? Любая помощь приветствуется.

+0

Im довольно уверен, что вам нужно будет использовать обертку. Однако для того, чтобы Python заходил в вашу DLL-оболочку, функции должны быть C вместо C++. Отбросьте все синтаксис пространства имен и классов и просто внесите «C» ваши глобальные функции (как в заголовке, соответствующем lib). Сохраните макрос Hardware_API и убедитесь, что Hardware_EXPORTS определен при создании библиотеки DLL. – qexyn

+0

@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

ответ

1

Спасибо @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]); 

После этого все работало. Мне удалось получить информацию об оборудовании в моем SDK python. Обязательно добавьте extern «C», иначе имена будут искалечены, и они будут выглядеть уродливыми, если вы будете искать свою функцию в зависимом ходоке. Спасибо за помощь

Смежные вопросы