2016-10-27 18 views
1

.libファイルに含まれているいくつかの関数をPythonにインポートしようとしています。ハードウェアコンポーネント。私はPythonへの.libファイルをインポートすることは本当に簡単ではないことをオンラインで読む:.libと.hファイルをPythonで使用できるDLLに変換する

Static library (.lib) to Python project

だから私は.libファイルとそれに対応する.hファイルを使用してDLLを構築しようとしています。私は.libソースコードにアクセスできない。私がアクセスできるのは.hファイルだけです。私はオンラインを見て、これを見つけた:私は、Python用のDLLを構築していますので

Converting static link library to dynamic dll

私は.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 -

0123ラッパーを実装
#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ファイルを直接呼び出して関数を呼び出すことができるはずなので、ラッパーを無意味にするのが好きです。ラッパーを作成しない限り、libファイルのソースコードを取得せずにdllを作成することができます。 libファイルのソースコードを知らずにdllを作成する方法はありますか? Pythonに直接libファイルをインポートする方法はありますか?どんな助けもありがとうございます。

+0

私はかなりラッパーのアプローチを使用する必要があります。しかし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]、unsigned int numBits [16]、unsigned int numLines [16]); ' 関数はビルドされていないため、PythonやC++で関数にアクセスすることはできません。私がextern "C"を持っていなければ、ビルドしたC++アプリケーションでもdllを利用できますが、Pythonはそれらにアクセスできません。 PythonがDLLを使用するためには、extern "C"が必要であることがわかります。私は間違って書いていますか? – halochief996

答えて

1

ありがとうございました。だから、私はラッパー(_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"を追加してください。そうしないと、名前が変更され、依存関係ウォーカーであなたの関数を調べると醜い表示になります。助けをありがとう

関連する問題