9

GNU autoconf / automakeビルドに関する質問は見たことがありませんが、少なくとも何人かがそれに精通していることを願っています。ここに行きます:

別のプロジェクト(ベンダー)を含むプロジェクト(myprojectと呼びます)があります。ベンダープロジェクトは、他の誰かによって維持されているスタンドアロンプ​​ロジェクトです。このようなプロジェクトを含めるのはかなり簡単ですが、この場合は小さな問題があります。各プロジェクトは独自のconfig.hファイルを生成し、各ファイルはPACKAGE、VERSIONなどの標準マクロを定義します。これは、ビルド中、ベンダーがビルド中ですが、次のようなエラーがたくさん発生します。

... warning: "VERSION" redefined
... warning: this is the location of the previous definition
... warning: "PACKAGE" redefined
... warning: this is the location of the previous definition

これらは、少なくとも当面は単なる警告ですが、私はそれらを取り除きたいと思います。私がグーグル検索で見つけた唯一の関連情報は、automakeメーリングリストのこのスレッドであり、それはあまり役に立ちません。他にもっと良いアイデアはありますか?

4

3 に答える 3

5

いくつかのメモ:

  • どのようconfig.hに含まれているかについては言及していませんでした-引用符または山括弧を使用して。違いの詳細については、この他の質問を参照してください。要するに、config.h通常、山かっこではなく引用符で囲まれています。これにより、プリプロセッサconfig.hはプロジェクト独自のディレクトリからの を優先するはずです (通常はこれが必要です)。
  • サブプロジェクトには、それを取り囲むプロジェクトのサブプロジェクトを含める必要があると言いますが、config.h通常、これはあなたが望むものではありません。サブプロジェクトはスタンドアロンであり、その PACKAGE と VERSION は、あなたのものではなく、そのサブプロジェクトのものでなければなりません。たとえば、xmlreader プロジェクトに libxml を含める場合でも、libxml コードを PACKAGE libxml および VERSION (libxml のバージョンに関係なく) でコンパイルする必要があります。
  • 通常、config.hパブリック ヘッダーからインクルードされるのは大きな間違いです。config.hプロジェクトまたはサブプロジェクトに対して常にプライベートであり、.c ファイルからのみ含める必要があります。したがって、ベンダーのドキュメントに「vendor.h」を含めるように記載されていて、その公開ヘッダーにconfig.h何らかの形で含まれている場合、それはノーノーです。config.h同様に、プロジェクトがライブラリの場合、パブリックにインストールされたヘッダーのどこにも含めないでください。
于 2008-08-25T21:52:23.997 に答える
2

config.hこれは間違いなくハックですが、自動生成されたファイルを後処理します。

sed -e 's/.*PACKAGE_.*//' < config.h > config.h.sed && mv config.h.sed config.h

これは私たちのビルド環境では許容できますが、よりクリーンな方法に興味があります。

于 2008-08-12T20:18:22.180 に答える
1

私の場合、非常に簡単な解決策があったことがわかりました。ベンダー プロジェクトは、いくつかのヘッダー ファイルを 1 つのモノリシック ヘッダー ファイルにまとめます。これは#include、ベンダー ソースによって作成されます。しかし、モノリシック ヘッダーを構築する make ルールに、生成されたconfig.h. モノリシック ヘッダーに PACKAGE、VERSION などの構成変数が存在することが、再定義の警告の原因でした。「 config.h config.h」は常に$(top_builddir)/config.h.

これが本来あるべき姿だと思います。デフォルトでは、サブプロジェクトがconfig.h明示的に独自のプロジェクトをインクルードするか、INCLUDE パスを操作して独自のディレクトリが の前$(top_builddir)に来るようにするか、そうでなければ私の場合のようにヘッダー ファイルを操作しない限り、サブプロジェクトはそれ自身の代わりにそれを囲むプロジェクトをインクルードする必要があります。

于 2008-08-14T16:16:56.203 に答える