0

次のような関数テンプレートを含むいくつかのヘッダー ファイルを持つ共有ライブラリに取り組んでいます。

#ifdef somecompilerflag
#define FUNCTION functionA
#else
#define FUNCTION functionB
#endif

void FUNCTION( ... );

私のライブラリをsomecompilerflagコンパイルするときに定義されたものです。ただし、他の誰かがこのライブラリにリンクしたい場合、これらのヘッダー ファイルをインクルードするときにコンパイラ フラグを取得する必要はありません。ライブラリをコンパイルするときにこれらを解決して、結果のヘッダー ファイルが次のようになるようにする方法はありますか。#ifdefs

void functionA( ... );
4

4 に答える 4

1

Linux&co をターゲットにしている場合は、「pkg-config」と呼ばれるものがあります。これは、インストールされている特定のライブラリのコンパイラとリンカーの設定を取得するためのフレームワークです。もう 1 つのオプションは、sed スクリプトを記述して、テンプレート ヘッダー ファイルをインストール用の正しいバージョンに変換することです。コンパイル中に同じヘッダーが使用され、それが適合することを保証できるため、ライブラリをコンパイルする前にそうするでしょう。

于 2013-01-15T20:22:09.150 に答える
0

Makefileに定義を追加できます。その方法については、こちらをご覧ください。C / C++#definesをmakefileに渡す

于 2013-01-15T20:17:23.623 に答える
0

以前、このアプローチをほのめかした回答がありました。これはsomecompilerflag、ヘッダー ファイルを「コンパイル」するとき (実際には別のディレクトリにコピーするとき)#define somecompilerflagに、ファイルの先頭に挿入するというものです。メイクファイルの場合、次の行に沿ったもの:

ifeq ($(somecompilerflag),-Dsomecompilerflag)
    sed '1 i\#define somecompilerflag' $(header) > headersDir/$(header)
else
    cp $(header) headersDir/$(header)
endif
于 2013-01-15T21:38:44.750 に答える
0

最初のプリプロセッサ ディレクティブを #ifdef ではなく #ifndef に変更するのはどうですか?

このように、フラグが設定されていない場合、FUNCTION は functionA に解決されます。

さらに進んで、プリプロセッサ ディレクティブを他の人に見られないようにしたい場合は、単純にコードをプリプロセッサで実行し、結果の出力を人々に渡すことができます。

于 2013-01-16T04:52:46.367 に答える