2

config.hライブラリとそのライブラリ上に構築されたソフトウェアの両方にautotools(ファイルを含む)を使用すると、コンパイラは一部のマクロ(PACKAGE_NAME、PACKAGE_TARNAMEなど)の再定義について文句を言います。

どうすればこれを防ぐことができますか?

このconfig.hファイルは、その設定をそれを使用するソフトウェアに伝達するためにライブラリに必要です。

library_config.h現在、オリジナルを含み、config.hユーザーがautotoolsを使用していないときにデフォルトを提供するラッパースクリプトがありますが、そのパッケージ内のマクロの定義を解除しても、gccから再定義の警告が表示されます。

#ifndef LIB_CONFIG_H
#define LIB_CONFIG_H
#ifdef HAVE_CONFIG_H
#  include "config.h"
#  undef PACKAGE
#  undef PACKAGE_BUGREPORT
#  undef PACKAGE_NAME
#  undef PACKAGE_STRING
#  undef PACKAGE_TARNAME
#  undef PACKAGE_VERSION
#  undef VERSION
#else
#  if defined (WIN32)
#    define HAVE_UNORDERED_MAP 1
#    define TR1_MIXED_NAMESPACE 1
#  elif defined (__GXX_EXPERIMENTAL_CXX0X__)
#    define HAVE_UNORDERED_MAP 1
#  else
#    define HAVE_TR1_UNORDERED_MAP 1
#  endif
#endif
#endif

最善のオプションは、そのマクロのないライブラリを用意することだと思います。autotoolsを使用するときに、ライブラリでPACKAGE、PACKAGE_NAMEなどの定義を回避するにはどうすればよいですか。

編集:よりよく説明しようとします。

ライブラリのでAC_CONFIG_HEADERマクロを使用するとき、私は多くの有用な定義を含むファイルを作成します。この定義は、ライブラリ自体(コンパイルされた部分とそのヘッダーファイルの両方)およびクライアントソフトウェアに役立ちます。ただし、必要な便利なマクロと、autotoolsがクライアントソフトウェア構成にも使用されるときに衝突する固定名(PACKAGE、PACKAGE_NAME)を持つ他の汎用定義が混在しているのは残念です。configure.acconfig.hAC_CONFIG_HEADER

4

2 に答える 2

2

アプリケーションがライブラリに動的にリンクする可能性がある場合、ライブラリの静的文字列をアプリケーションに静的に組み込むことは意味がありません。

それ以外の場合は、 を探してくださいax_prefix_config_h.m4

私はまだファイルのインストールを避けconfig.h、ライブラリのAPIを定義することに頼らずにしようとしますconfig.h:

/* library.h */
const char library_version[];

/* library.c */
#include "library.h"
#include "config.h" /* the library's config.h */
const char library_version[] = PACKAGE_VERSION;

/* application.c */
#include "library.h"
#include "config.h" /* the application's config.h */
int main()
{
   print("This is app version %s.\n", PACKAGE_VERSION);
   print("The library is version %s\n", library_version);
   return 0;
}

公開ライブラリのヘッダー ファイルが#include "config.h"インストールされていないこと、およびライブラリがその .xml ファイルをインストールしていないことを確認してくださいconfig.h

于 2010-04-03T17:12:59.170 に答える
1

ソフトウェアAC_CONFIG_SUBDIRS([library])configure.ac. これにより、競合が解消され、トップレベルの構成からの設定がサブパッケージに伝達されます。

この機能を説明している Autoconf マニュアルのページへのリンクは次のとおりです: http://www.gnu.org/software/hello/manual/automake/Subpackages.html

于 2010-04-03T20:46:36.053 に答える