記事のディレクトリ
I.はじめに
私たちが通常コードを書くとき、特にホイールを製造するとき(他の人にライブラリファイルを提供するとき)、さまざまな需要シナリオに遭遇します。
- Linuxシステムで使用する必要がある人もいれば、Windowsシステムで使用する必要がある人もいます。
- 開発にC言語を使用する人もいれば、開発にC ++を使用する人もいます。
- 動的ライブラリを使用する人もいれば、静的ライブラリを使用する人もいます。
特にWindowsシステムでは、ライブラリファイルでエクスポートされた関数は_declspec(dllexport)を使用して関数を宣言する必要があり、ユーザーはインポート時に_declspec(dllimport)を使用して関数を宣言する必要があります。これは非常に面倒です。
この短い記事では、ヘッダーファイルを共有しています。このヘッダーファイルと、コンパイル中に渡されるいくつかのマクロを使用すると、上記のさまざまなニーズを完全に処理できます。
次に、ヘッダーファイル
コードを直接アップロードするだけで、最初にコードを分析してから、さまざまな使用シナリオを1つずつ分析します。
このヘッダーファイルの主な目的は、マクロMY_APIを定義し、ライブラリファイルにエクスポートする必要がある各関数またはクラスの宣言にこのマクロを追加することです。例えば:
void MY_API do_work();
ヘッダーファイルは次のとおりです。
_Pragma("once")
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
#define MY_WIN32
#elif defined(linux) || defined(__linux) || defined(__linux__)
#define MY_LINUX
#endif
#if defined(MY_WIN32)
#ifdef MY_API_STATIC
#ifdef __cplusplus
#define MY_API extern "C"
#else
#define MY_API
#endif
#else
#ifdef MY_API_EXPORTS
#ifdef __cplusplus
#define MY_API extern "C" __declspec(dllexport)
#else
#define MY_API __declspec(dllexport)
#endif
#else
#ifdef __cplusplus
#define MY_API extern "C" __declspec(dllimport)
#else
#define MY_API __declspec(dllimport)
#endif
#endif
#endif
#elif defined(MY_LINUX)
#ifdef __cplusplus
#define MY_API extern "C"
#else
#define MY_API
#endif
#endif
3、事前定義されたマクロ
あなたが書く必要があると仮定し、ライブラリファイルをし、使用する他の人のためにそれを提供しています。上記の最初のドキュメントを定義した後、他のドキュメントにはこのヘッダーファイルを含める必要があります。
1.プラットフォームマクロの定義
さまざまなプラットフォームには、対応するマクロ定義が事前定義されています。次に例を示します。
Windowsプラットフォーム:WIN32、_WIN32、WIN32 ;
Linuxプラットフォーム:linux、__ linux、linux ;
特定のプラットフォームでは、これらのマクロがすべて定義されているわけではなく、そのうちの1つだけが定義されている可能性があります。
統一のために、ヘッダーファイルの先頭でこれらの可能なマクロを統合し、独自のプラットフォームマクロ定義MY_WIN32またはMY_LINUXを定義します。後で異なるプラットフォームを区別する必要がある場合は、この自己定義のマクロを使用します。プラットフォームマクロ。
もちろん、MY_MAC、MY_ARMなどの他のプラットフォームを拡張し続けることができます。
2.コンパイラマクロの定義
ライブラリコードの記述時にC ++を使用し、ユーザーがC言語を使用する場合は、コンパイラが関数の名前を書き換えないように、ライブラリ関数のextern "C"宣言を行う必要があります。
コンパイラーg ++の事前定義されたマクロ__cplusplus
、したがって、ヘッダーファイルでは、このマクロを使用MY_API
してextern "C"ステートメントを追加します。
第四に、Windowsプラットフォームのシナリオ分析
1.ライブラリファイルをコンパイルして生成します
(1)静的ライブラリを生成する
静的ライブラリでは、__declspec(dllexport/dllimport)
ステートメントはありません。コンパイラ(gccまたはg ++)を区別し、マクロコンパイラオプションを定義するMY_API_STATIC
だけで、最終的なMY_API
ものを取得できます。
gccコンパイラ:#define MY_API
g ++コンパイラ:#define MY_API extern“ C”
(2)ダイナミックライブラリを生成する
オプションのコンパイルでは、マクロを定義しMY_API_EXPORTS
て、結果MY_API
が次のようになるようにします。
gccコンパイラ:#define MY_API __declspec(dllexport)
g ++コンパイラ:#define MY_API extern“ C” __declspec(dllexport)
2.ライブラリの使用
では、ライブラリ使用してアプリケーションを、また、あなたはヘッダファイルにこのコードを含め、その後、対応する生成する、定義されたマクロコンパイラのさまざまなオプションを追加する必要がMY_API
マクロ定義を。
(1)静的ライブラリを使用する
コンパイルオプションMY_API_STATIC
で定義する必要があります、あなたは最終的なMY_API
ものを得ることができます:
gccコンパイラ:#define MY_API
g ++コンパイラ:#define MY_API extern“ C”
(2)ダイナミックライブラリを使用する
コンパイルオプションで定義されたマクロは必要ありません。最終的なMY_API
ものを取得できます。
gccコンパイラ:#define MY_API extern“ C” __declspec(dllimport)
g ++コンパイラ:#define MY_API __declspec(dllimport)
これは、ライブラリのインポート関数を宣言することと同じです。
5、Linuxプラットフォームのシナリオ分析
Linuxプラットフォームでははるかに簡単で、コンパイラの問題に注意を払うだけでよく、エクスポートとインポートの区別はありません。
1. C言語のポインター-最下位の原則から高度なスキルまで、グラフィックとコードを使用して完全に説明します
2.元のgdbの最下位のデバッグの原則は非常に単純です
3.ステップバイステップの分析-Cの使用方法オブジェクト指向プログラミングを実装する
4.すべてのことソフトウェアアーキテクチャを階層化してモジュールに分割する必要があり、具体的に何を行う必要があるか(1)
5。ソフトウェアアーキテクチャを階層化してモジュールに分割する必要があると言われています。具体的に行う必要があります(2)