.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ファイルをインポートする方法はありますか?どんな助けもありがとうございます。
私はかなりラッパーのアプローチを使用する必要があります。しかしPythonがあなたのラッパーDLLを呼び出すためには、関数はC++ではなくCでなければなりません。すべての名前空間とクラスの構文を削除し、グローバル関数を単にextern "C"にします(libと一致するヘッダーのように)。そこにHardware_APIマクロを保存し、DLLをビルドするときにHardware_EXPORTSが定義されていることを確認します。 – 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"を持っていなければ、ビルドしたC++アプリケーションでもdllを利用できますが、Pythonはそれらにアクセスできません。 PythonがDLLを使用するためには、extern "C"が必要であることがわかります。私は間違って書いていますか? – halochief996