1

解決方法がわからないという問題に直面しています。.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ヘッダーを含めないでください)?

ガイダンスをいただきありがとうございます。

+3

XY問題のような音:問題に対して間違った解決策をどのように修正するかを質問します。そして言語を選ぶ:CまたはC++? – Olaf

+5

C++の場合、[One Definition Rule(ODRとも呼ばれます)](https://en.wikipedia.org/wiki/One_Definition_Rule)があります。 'CONFIG_A'がいくつかの[翻訳単位](https://en.wikipedia.org/wiki/Translation_unit_(プログラミング))をコンパイルするときに定義されているが、他のものでは定義されていない場合、*未定義の動作*があります。 –

+0

ライブラリをインストールする際には、適切なプリプロセッサオプションとともに 'mylibrary.pc'ファイルをインストールすることもできます。その後、 'pkg-config --cflags mylibrary'を使用するようにユーザに指示します。 – rodrigo

答えて

0

構造定義のコードを「生成」し、生成された定義を対応するライブラリとともに出荷することができます。 1つのアイデアは、#includeのヘッダーに構造体を保持することです。この場合、Cプリプロセッサを実行して、#ifdefのファイルを取得できます(ビルドと出荷に使用できます)。

別の方法は、ビルドシステムで特別なことをすることです。たとえば、CMake#cmakedefineです。これをCまたはC++ソースファイル内で使用してからコードを生成することができます。

関連する問題