アプリケーションを手動ビルドから autoconf に移行しようとしていますが、これはこれまでのところ非常にうまく機能しています。しかし、統合方法がわからない静的ライブラリが 1 つあります。そのライブラリは、通常のライブラリの場所には配置されません。バイナリ (.a ファイル) とヘッダー (.h ファイル) の場所は、configure 引数として指定されます。(特に、.a ファイルを /usr/lib またはその他の考えられる場所に移動しても、機能しません。) また、伝統的に名前が付けられていません (「lib」または「l」で始まっていません)。 」)。
手動コンパイルはこれらで機能します (ディレクトリは予測できません - これは単なる例です):
gcc ... -I/home/john/mystuff /home/john/mystuff/helper.a
(ええと、実際には、.a ファイルが -L などを使用せずに直接参照される理由がわかりません。はい、C プログラムの構築について中途半端な理解があります。)
したがって、configure.ac では、関連する構成引数を使用して、AC_CHECK_HEADER を使用してヘッダー (.h ファイル) を正常に見つけることができます。次に、AC_CHECK_HEADER 内で CPFLAGS に場所を追加し、実際の C コードのヘッダー ファイルの #include がそれを適切に取得します。
$location に配置された configure 引数と、必要なファイルの名前が helper.h および helper.a (両方とも同じディレクトリにあります) である場合、これまでの動作は次のとおりです。
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location"])
問題が発生するのは、バイナリ (.a ファイル) をリンクすることです。何をしようとしても、そのライブラリの関数呼び出しへの未定義の参照に関するエラーが常に発生します。Cコードに大騒ぎし、そのライブラリへの関数呼び出しで意図的なエラーを作成して、関数プロトタイプがロードされ、コンパイルに使用されたことを示す以前のエラーを生成する可能性があるため、リンケージの問題であると確信しています。
.a ファイルを含む場所を LDFLAGS に追加してから、AC_CHECK_LIB を実行しようとしましたが、見つかりません。
構文が間違っているか、もっと基本的なことが抜けているのかもしれません。
これが私が試したことです:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location";
LDFLAGS="$LDFLAGS -L$location";
AC_CHECK_LIB(helper)])
サイコロはありません。AC_CHECK_LIB は -lhelper を探していると思います (または libhelper?) ので、それが問題かどうかわからないので、これも試してみました (AC_CHECK_LIB を省略し、.a を LDFLAGS に直接含めます)、運が悪い:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location";
LDFLAGS="$LDFLAGS -L$location/helper.a"])
手動コンパイルをエミュレートするために、 -L を削除しようとしましたが、それは役に立ちません:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location";
LDFLAGS="$LDFLAGS $location/helper.a"])
他の組み合わせや順列を試してみましたが、もっと基本的なものが欠けているのではないかと思います....
================ 更新
次のように _LDADD を使用して、Makefile.am の .a ファイルへのハードコードされたパスで動作するようにしました。
myprog_LDADD=/home/john/mystuff/helper.a
しかし、.a ファイルの場所を予測できません。なんらかの理由で、configure.ac で myprog_LDADD を定義しても機能せず (できれば、動的な場所変数を使用できるので)、LDFLAGS、myprog_LDFLAGS、AM_LDFLAGS への変更の組み合わせが機能しないようです。
Makefile.am で、configure.ac で定義されている変数の場所を使用しようとすると、機能しません。
myprog_LDADD=($location)helper.a
================ 更新
私はそれを理解したと思いますが、自分が何をしているのかわからないので、フィードバックをいただければ幸いです. AC_SUBST() を使用して myprog_LDADD を configure.ac から動作させたので、最終的な解決策は次のようになります。
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location"
myprog_LDADD="$location/helper.a"
AC_SUBST(myprog_LDADD)])