15

アプリケーションを手動ビルドから 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)])
4

1 に答える 1

10

で場所を設定できますconfigure.ac

LOCATION=/home/john/mystuff
AC_SUBST(LOCATION)

AC_SUBST$LOCATIONは、すべての で変数を定義し、Makefile.am出現するすべての@LOCATION@を の内容に置き換えます$LOCATION。それで、あなたはMakefile.amあなたがすることができます

myprog_CPPFLAGS="-I$LOCATION"
myprog_LDADD="$LOCATION/helper.a"

PS。ライブラリを直接参照する必要があるのは、 がシステム ライブラリ ディレクトリで-l適切な名前のライブラリ (例: ) を検索するためです。libhelper.aただし、静的ライブラリとオブジェクト ファイルの間にはそれほど大きな違いはないため、 を使用して魔法のように参照する必要はありません-l。現在行っているように、プログラムにコンパイルできます。

于 2010-05-02T19:16:29.053 に答える