C++ ダイナミック ライブラリの dllexport と dllimport について

まず、Microsoft Coplilot よりも優れた補助プログラミング ツールをお勧めします - Cursor、GPT4 に基づく新世代の補助プログラミング アーティファクト - Cursor、公式 Web サイトによると、OpenAIと連携し、GPT4 に基づいています。私はそれを自分自身で経験しました、それは本当に良いです、それは試してみる価値があります.

公式サイトアドレス:

カーソル | 高速ビルド

動的ライブラリの dllexport および dllimport キーワードの使用について。いつ dllexport を使用するか、いつ dllimport を使用するか。

dllexport と dllimport

は、ダイナミック リンク ライブラリ (DLL) の関数とデータをエクスポートおよびインポートするために使用されるキーワードです。Windows オペレーティング システムでは、ダイナミック リンク ライブラリは、複数のアプリケーションで共有できるコードとデータを含む再配置可能なバイナリ ファイルです。ダイナミック リンク ライブラリを使用すると、実行可能ファイルのサイズを縮小できるだけでなく、コードの再利用性と保守性も向上します。

dllエクスポート

関数またはデータを DLL にエクスポートして、他のアプリケーションが使用できるようにするために使用されます。たとえば、次のようなプログラムを作成すると、

MyFunction を作成し、それを dllexport としてマークすると、他のアプリケーションは LoadLibrary および GetProcAddress 関数を使用して関数を読み込んで呼び出すことができます。

dllimport

アプリケーションがそれらを使用できるように、DLL から関数またはデータをインポートするために使用されます。たとえば、アプリケーション内の別の DLL で関数を使用する場合は、その関数を dllimport としてマークし、コードで使用できます。

dllexport と dllimport を使用する場合、次の点に注意する必要があります。

  • dllexport と dllimport は、Windows オペレーティング システムでのみ使用できます。

  • dllexport と dllimport は、ダイナミック リンク ライブラリ (DLL) でのみ使用できます。

  • dllexport と dllimport は、関数とデータのエクスポートとインポートにのみ使用できます。

  • dllexport と dllimport の構文は同じですが、使用方法が異なります。

  • dllexport と dllimport の両方で、関数またはデータの名前と可視性を指定する必要があります。

  • dllexport と dllimport の両方で、関数またはデータの呼び出し規約を指定できます。

  • dllexport と dllimport の両方で、関数またはデータのストレージ クラスを指定できます。

dllexport によって生成される lib ファイルは、静的ライブラリまたはインポート ライブラリのいずれかです。生成された .lib ファイルには、エクスポートされた関数に関する情報と、リンク時に関数アドレスを解決するために使用される情報が含まれています。エクスポートされた関数を dllexport としてマークすると、コンパイラは、エクスポートされた関数に関する情報を含む .lib ファイルを生成します。インポートされた関数を dllimport としてマークすると、コンパイラは、インポートされた関数に関する情報を含む .lib ファイルを生成します。

.lib ファイルの役割は、リンク時に関数アドレスを解決することです。アプリケーションを作成し、ダイナミック リンク ライブラリで関数を呼び出す場合、コンパイラは関数のアドレスがどこにあるかを知りません。したがって、コンパイラは、関数の名前を含むシンボル テーブルを生成し、.obj ファイルに保存します。アプリケーションをリンクすると、リンカーはシンボル テーブルで関数名を検索し、関数のアドレスに置き換えます。静的にリンクされたライブラリを使用している場合、リンカーは関数のコードをアプリケーションにコピーするだけです。インポート ライブラリを使用している場合、リンカーは実行時に DLL から関数を読み込みます。

.lib ファイルを使用するには、リンカー コマンド ラインに含める必要があります。たとえば、MyLibrary という DLL があり、その DLL の関数をアプリケーションで使用する場合は、次のコマンド ラインを使用できます。

このうち、/I オプションはヘッダー ファイルの検索パスを指定するために使用され、/link オプションはリンカを指定するために使用され、/LIBPATH オプションは指定するために使用されます。

.lib ファイルの検索パス。MyApplication.cpp はアプリケーション ソース ファイルで、MyLibrary.lib は DLL のインポート ライブラリです。

Q_DECL_IMPORTとQ_DECL_EXPORT

これらは Qt の 2 つのマクロ定義であり、異なるプラットフォームでダイナミック リンク ライブラリのインポートとエクスポートを実現するために使用されます。Windows プラットフォームでは、ダイナミック リンク ライブラリのインポートとエクスポートには __declspec(dllexport) および __declspec(dllimport) キーワードを使用する必要がありますが、Linux プラットフォームでは __attribute__((visibility("default"))) を使用する必要があります。キーワード。

クロスプラットフォーム開発を容易にするために、Qt は Q_DECL_IMPORT および Q_DECL_EXPORT マクロを定義します。これらは異なるプラットフォームでは異なるキーワードとして定義され、クロスプラットフォームのダイナミック リンク ライブラリのインポートとエクスポートを実現します。

Q_DECL_IMPORT

通常ヘッダー ファイルで使用されるダイナミック リンク ライブラリのインポートされた関数または変数を宣言するために使用されます。Windows プラットフォームでは Q_DECL_IMPORT は __declspec(dllimport) として定義され、Linux プラットフォームでは空のマクロとして定義されます。Q_DECL_IMPORT を使用すると、ヘッダー ファイル内の関数と変数をさまざまなプラットフォームで正しくインポートできます。

Q_DECL_EXPORT

通常はソース ファイルで使用される、ダイナミック リンク ライブラリのエクスポートされた関数または変数を宣言するために使用されます。Windows プラットフォームでは、Q_DECL_EXPORT は __declspec(dllexport) として定義され、Linux プラットフォームでは __attribute__((visibility("default"))) として定義されます。

Q_DECL_EXPORT を使用すると、ソース ファイル内の関数と変数を異なるプラットフォームで正しくエクスポートできます。

dll 動的ライブラリには lib ファイルがありません。使用方法は?

dll ライブラリと対応する lib ファイルが同時に提供されている場合、動的ライブラリの使用は非常に簡単で、コンパイラはリンク時にグローバルにロードできます。DLL ファイルしかなく、LIB ファイルがない場合は、LoadLibrary 関数を使用して DLL ファイルをロードし、関数ポインタを取得できます。この方法は動的リンクと呼ばれます。次に例を示します。

#include <windows.h>
#include <iostream>

typedef int (*MYPROC)(int);

int main() {
    HINSTANCE hinstLib;
    MYPROC ProcAdd;

    hinstLib = LoadLibrary(TEXT("MyDll.dll"));
    if (hinstLib != NULL) {
        ProcAdd = (MYPROC)GetProcAddress(hinstLib, "MyFunction");
        if (ProcAdd != NULL) {
            int result = ProcAdd(1);
            std::cout << "Result: " << result << std::endl;
        } else {
            std::cout << "Could not find function" << std::endl;
        }
        FreeLibrary(hinstLib);
    } else {
        std::cout << "Could not load library" << std::endl;
    }

    return 0;
}

この例では、LoadLibrary 関数を使用して MyDll.dll ファイルを読み込みます。次に、GetProcAddress 関数を使用して MyFunction 関数のアドレスを取得します。最後に、関数ポインタを型 MYPROC にキャストし、それを呼び出して関数を実行します。

参照:

カーソル | すばやく構築

Microsoft Coplilot より優れた補助プログラミング ツール - Cursor - Programmer Sought

おすすめ

転載: blog.csdn.net/qq8864/article/details/129705375