2017-12-27 11 views
1

私は最近、公共のヘッダの中にHAVE_FEATUREFOOのような変数を使用するライブラリを見つけました。パブリックヘッダに `AC_DEFINE`と` AC_DEFINE_UNQUOTED`で定義された変数を正しく使うには?

また、文#include "config.h"を含むものも含まれます。これらの宣言は構造体宣言でも使用され、構造体のメンバーを条件的に削除します。ライブラリのビルドや依存するプログラムのビルドに使用される値の不一致は、メモリの破損につながります。

ので、ライブラリの使用とそれのヘッダには、次のことができた結果:

  • #include "config.h"が失敗し、
  • または実行時にメモリ破損。

私はautotoolsの新機能ですが、私が見つけた調査の結果、AC_DEFINE or AC_DEFINE_UNQUOTEDを使って定義されています。そしてconfig.hAC_CONFIG_HEADERSを使用して生成されます。

さらに調査したところ、include_HEADERSというヘッダーがインストールされています。そして、ヘッダconfig.hが正しくインストールされます(リストに追加されている場合)。

AC_CONFIG_HEADERSによってconfig.hヘッダーファイルを自動ツールでインストールすることは正しい方法ですか?

答えて

1

生成されたconfig.hファイルは、決してユーザーコードに含めないでください。つまり、ライブラリのヘッダーはconfigureテストとは独立している必要があり、config.hをインストールしないでください。

1

AC_CONFIG_HEADERSによってautotoolsによって生成されたconfig.hヘッダファイルをインストールするのは正しいアプローチですか?

プロジェクトに属する他のインストールヘッダがconfig.hに依存している場合は、[はい、config.hも、インストールする必要があります。ビルドされたソフトウェアは、config.hに記されているように、ビルド時のビルドシステムのプロパティに依存するため、これは唯一実行可能なアプローチです。あなたは、一般的に事実の後にそれを正しく再現することは期待できません。

しかし、インストールのヘッダーすべき最初の場所ではない#include Autotool群config.hヘッダ、また彼らは間接的に1に依存している必要があります。また、インクルードファイル検索パス、またはインクルードパスに追加されることがあると予想される可能性のあるディレクトリに、config.hという名前のファイルをインストールしないでください。衝突の危険性はあまりにも大きい - ヘッダー名はある程度重要だが、そのようなヘッダーで定義され、依存しているマクロ名の方が顕著である。

ボトムライン:Autotools config.hファイルは、ではなく、のビルド結果ではなく、関連付けられているプロジェクトをビルドするために使用されます。特に、そのようなプロジェクトにライブラリが含まれている場合、config.hは、ライブラリ独自のヘッダファイルによる使用方法や、ライブラリを使用して呼び出すコードによる直接使用には適していません。 Autotoolsは、インストール時に意図されたヘッダをカスタマイズすることによって、ビルド時のシステム構成を記憶させるためのさまざまなメカニズムを提供します。


これは、あなたが尋ねているライブラリに関してあなたをどこから残していますか?私が提出した問題は、コード品質が悪いことを示すものであるため、代替案を見つけることを強く検討すべきです。あなたがプロジェクトを修正しようとするかもしれない方法がありますが、あなたの時間を費やすことはまずありません。特にAutotoolsの新人として。

関連する問題