0

私が管理しているライブラリには、pthreads に依存する関数がいくつかあります。プロジェクトは automake を使用します。pthreads への依存関係を無効にする構成オプションを作成したいと考えています。これは単にこれらの関数をコンパイルしないようにする必要があります。(理由は、特定のクロスコンパイルおよび組み込みターゲットのためです。)

これらの関数を含むファイルをコンパイルしないことは今のところ問題ありませんが、これらの関数とそれらが使用する 1 つの構造体がパブリック ヘッダーで定義されていることに気付きました。

  1. ライブラリのメンテナンスの観点から、ここでの正しいアプローチは何ですか?
  2. パブリックヘッダーで型または関数をオプションにする正しい方法は何ですか?

最初は、ヘッダーを autoconf 入力 (.in) ファイルに変換し、これらの関数とタイプをオプションで削除してヘッダーを生成する必要があると考えました。

では、異なるバージョンのライブラリが同時にインストールされている可能性のあるシステムについてはどうでしょうか? 通常、これらはヘッダーを共有できるはずです。

これらの関数を回避するためにプリプロセッサ条件を使用するヘッダーを作成し、pkg-configそれをコマンドライン オプションとして指定するために使用する必要がありますか?

別のアイデアは、これらの関数と型を独自のヘッダーに移動し、pthread が無効になっているときにこのヘッダーをインストールしないようにすることです。これは、ヘッダーの編成をわずかに台無しにすることを意味しますが、おそらく最良のアイデアです。私はあなたの意見が欲しいのですが、ライブラリの公開ヘッダーでオプション機能を処理する最良の方法は何ですか?

4

2 に答える 2

1

1つの方法は、スレッドを必要とする関数を組み込みプラットフォームに引き続き存在させ、それらが呼び出された場合にエラーコードを返すことです。そうすれば、APIはプラットフォーム間で同じままです。これは、ライブラリ(「プログラム」)を使用するコードにとって非常に望ましいことです。プログラムは、ライブラリ内の関数の存在についてautoconfのようなテストを必要とせず、それらを使用するだけでよいためです。そして、ソースコードレベルのifを利用して、それらの機能を決定します。

int mylib_thread_frenzy(void)
{
#ifdef HAVE_PTHREAD_CREATE
       int ret = pthread_create(...);
       if (ret < 0)
               return -errno;
       return 0;
#else
       return -ENOSYS;
#endif
}

/* Program */
int ret = mylib_thread_frenzy();
if (ret == -ENOSYS) {
    /* Hm, castrated platform. Try something else... */
    printf("Or just tell the user the platform is too weak.\n");
} else {
    printf("World domination acquired\n");
}

いずれの場合も、mylib.hに「config.h」を#includeしようとしないでください。また、config.hに記載されている定義が別のライブラリや他のライブラリの定義と衝突する可能性があるため、このconfig.hも出荷しないでください。プログラム。

mylib.hから関数を絶対に削除したい場合は、次のことが頭に浮かぶと思います。

/* mylib.h.in */
#if 0@HAVE_PTHREAD_CREATE@
extern int mylib_pthread_frenzy(void);
#endif

/* configure.ac */
AC_SEARCH_LIBS([pthread_create], [pthread],
  [HAVE_PTHREAD_CREATE=1
   AC_SUBST([HAVE_PTHREAD_CREATE])
  ])
AC_CONFIG_FILES([mylib.h.in])
AC_OUTPUT

ただし、mylib.h.inが変​​更されるたびにconfigureを再実行する必要があるため、2番目のアプローチは嫌いです。

于 2012-02-25T09:36:50.220 に答える
0

別のアイデアは、これらの関数と型を独自のヘッダーに移動し、pthread が無効になっているときにこのヘッダーをインストールしないようにすることです。

それが最もクリーンな選択でしょう。オプションを介して有効にするAC_ARG_ENABLEと、もちろん、すべての pthreads セットアップもバイパスできます。このオプションを使用すると、ライブラリに依存するパッケージは、これらの関数が実行時に機能するかどうかを確認するAC_TRY_COMPILE代わりに、pthread オプションの関数がそこにないことを ( 経由で)簡単に伝えることができAC_TRY_RUNます。

于 2012-02-27T19:32:41.737 に答える