0

ibv_modify_qp 関数には、異なるバージョンのライブラリに対して 2 つの異なる署名があります。どちらのライブラリもヘッダー ファイルを同じ場所にインストールします。以下は2つのバージョンです。

int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
              int attr_mask);
int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
              enum ibv_qp_attr_mask attr_mask);

私のライブラリでは、ドライバー固有の関数のポインターを ibv_context_ops 構造体に渡しています。

/*ibv_context_ops field contains function pointers to driver specific functions*/

static struct ibv_context_ops c4iw_ctx_ops = {
    .modify_qp = c4iw_modify_qp,
    }
int c4iw_modify_qp(struct ibv_qp *ibqp, struct ibv_qp_attr *attr,
               int attr_mask);

したがって、プロトタイプが一致する場合は警告は表示されませんが、プロトタイプが異なる場合は警告が生成されます。現在、以下に示すように CFLAGS を使用して条件付きでコンパイルしています。

#ifdef IBV_VER2

int c4iw_modify_qp(struct ibv_qp *ibqp, struct ibv_qp_attr *attr,
               int attr_mask);

#else

int c4iw_modify_qp(struct ibv_qp *ibqp, struct ibv_qp_attr *attr,
               enum ibv_qp_attr_mask attr_mask);
#endif

とにかく、gnu automake を使用して関数プロトタイプをチェックし、ライブラリ ヘッダー ファイルで定義された関数プロトタイプに基づいて関数引数を置き換えることができますか。

4

1 に答える 1

2

関数プロトタイプは実質的に同じです。関数に渡される整数値と列挙値の間に実際の違いはありません。したがって、あなたの場合、コンパイラの魔法をまったく行う必要はありません。コンパイラの警告の詳細を提供していただければ、回答を修正します。

とにかく、gnu automake を使用して関数プロトタイプをチェックし、ライブラリ ヘッダー ファイルで定義された関数プロトタイプに基づいて関数引数を置き換えることができますか。

本当に異なる API を使用している場合は、いずれかのバージョンでのみコンパイルされる最小限のプログラムを簡単に作成できます。プログラムがコンパイルされるかどうかにかかわらず、条件付きコンパイルの基礎として使用できます。

参照: http://www.gnu.org/software/autoconf/manual/autoconf.html#Running-the-Compiler

例: https://svn.apache.org/repos/asf/xerces/c/trunk/configure.ac

于 2013-10-19T12:20:06.353 に答える