解決方法がわからないという問題に直面しています。.hヘッダファイルからプリコンパイラ指令を削除する
はTEST.Hヘッダーファイルに次のtypedef構造体を仮定します
typedef struct example_struct {
#ifdef CONFIG_A
int A;
#endif;
int B;
} example_struct_t;
私は-DオプションとGCCにCONFIG_Aを渡し、このヘッダファイルを使用してコードをコンパイルしています。このようにして、指定されたユースケースに必要でない場合、構造体にAメンバを含めるか、削除することができます。
ここで、共有ライブラリ(.so)を生成して配布したいとします。ですから、私は.soライブラリとヘッダーにプリコンパイラ指令を付けました。問題は、ライブラリを使用してプログラムに-DCONFIG_Aを含めないことです。つまり、ライブラリコンパイル時に使用されるオプションをソースファイル(.c)だけでなく、ヘッダ。つまり、-DCONFIG_Aオプションを指定してライブラリをコンパイルすると、ライブラリを使用しているプログラムでコンパイル時にそのオプションが含まれていないと考えられます。
プリコンパイルされたヘッダーはこの問題の解決策ですか、あるいは他の方法がありますか(プリコンパイラ指令を定義するすべてのファイルにconfig.hヘッダーを含めないでください)?
ガイダンスをいただきありがとうございます。
XY問題のような音:問題に対して間違った解決策をどのように修正するかを質問します。そして言語を選ぶ:CまたはC++? – Olaf
C++の場合、[One Definition Rule(ODRとも呼ばれます)](https://en.wikipedia.org/wiki/One_Definition_Rule)があります。 'CONFIG_A'がいくつかの[翻訳単位](https://en.wikipedia.org/wiki/Translation_unit_(プログラミング))をコンパイルするときに定義されているが、他のものでは定義されていない場合、*未定義の動作*があります。 –
ライブラリをインストールする際には、適切なプリプロセッサオプションとともに 'mylibrary.pc'ファイルをインストールすることもできます。その後、 'pkg-config --cflags mylibrary'を使用するようにユーザに指示します。 – rodrigo