2016-10-27 25 views
1

所以我試圖導入包含在的.lib文件到Python的一些功能,以建立一個SDK,讓我談一些特殊硬件組件。我看網上,這不是很容易導入的.lib文件成Python:轉換一個的.lib和.h文件,可以在Python中使用的DLL

Static library (.lib) to Python project

所以我試圖建立使用的.lib和其相應的.h文件的DLL。我無法訪問.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文件源代碼。有沒有方法可以在不知道lib文件源代碼的情況下創建一個dll?有沒有辦法將lib文件直接導入到Python中?任何幫助表示讚賞。

+0

Im相當肯定,你將需要使用包裝方法。然而,爲了讓Python調用你的包裝DLL,函數應該是C而不是C++。刪除所有的命名空間和類的語法,只是extern「C」你的全局函數(就像在與lib匹配的頭文件中)。將Hardware_API宏保留在那裏,並確保在生成DLL時定義了Hardware_EXPORTS。 – qexyn

+0

@qexyn謝謝!所以我放棄了命名空間和類的語法,但是當我的extern 「C」 添加到我的全局函數像這樣: 「PlexDO_API的extern 「C」 INT DOGetDigitalOutputInfo(unsigned int類型deviceNumbers [16],無符號​​整型加numBits [16],無符號​​整型numLines [16]);」 功能不建,我無法通過Python或C++訪問它們。如果我沒有extern「C」,我仍然可以使用我構建的任何C++應用程序的dll,但Python無法訪問它們。我知道extern「C」是Python爲了使用DLL所必需的。我寫錯了嗎? – halochief996

回答

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中查找你的函數,它會顯得很難看。感謝您的幫助

相關問題