0

と の存在をチェックしようとするプロジェクトの構築に問題がshm_openありshm_unlinkます。関連する configure.ac の行は次のとおりです。

# Avoid adding rt if absent or unneeded
AC_CHECK_LIB(rt, shm_open, [EXTRA_LIBS="$EXTRA_LIBS rt" CFLAGS="$CFLAGS -lrt"])

# needs -lrt on linux
AC_CHECK_FUNCS([shm_open shm_unlink])

行はAC_CHECK_LIB成功AC_CHECK_FUNCSしますが、両方とも失敗します。をのぞいてみるとconfig.log、なるほど

configure:4133: checking for shm_open in -lrt
configure:4158: /usr/bin/gcc -o conftest  -fno-stack-protector         -Wl,--hash-size=31 -Wl,--reduce-memory-overheads   conftest.c -lrt   >&5
configure:4158: $? = 0
configure:4167: result: yes
configure:4178: checking for shm_open
configure:4178: /usr/bin/gcc -o conftest  -fno-stack-protector    -lrt      -Wl,--hash-size=31 -Wl,--reduce-memory-overheads   conftest.c  >&5
/tmp/ccg0yu56.o: In function `main':
conftest.c:(.text+0xa): undefined reference to `shm_open'
collect2: ld returned 1 exit status

2 つのチェックの唯一の違いは、-lrt引数の位置のようです。単純なファイルに対して手動で gcc を実行しようとすると、同じ動作が得られます。つまり、リンク-lrtはソース ファイルの入力後にのみ成功します。

configureそれで、それを決定しshm_openて存在するために私は何をする必要がありshm_unlinkますか?私が構成しているプロジェクトはかなり広く使用されており ( unixghc コンパイラーにバンドルされているパッケージ)、以前は機能していたため (gcc-4.4 を使用して別のシステムでこのパッケージをビルドしたとき)、これは私のシステムに特有のものであると思われます。 .5、それは機能しましたが、その環境は利用できなくなりました)。私の好ましい解決策は、システム/環境への変更、または構成するフラグの組み合わせのいずれかですがconfigure.ac、アップストリームに送信できる標準的な変更があれば、それも受け入れられます。

CFLAGS と LDFLAGS のさまざまな組み合わせを試しましたが、-lrtフラグは常に入力ファイルの前に表示されるため、チェックは失敗します。

私のシステムはUbuntu 12.04(正確)です

$gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
$ uname -a
Linux hostname 3.2.0-26-generic #41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

ありがとう!

4

1 に答える 1

0

マクロは完全な形式を持っています:

AC_CHECK_LIB (library, function, [action-if-found], [action-if-not-found], [other-libraries])

注意してくださいother-libraries。このオプションは、あなたが説明した場合に特に役立ちます-渡す-lmために、-lrtおよびリンカーの順序付けで未解決の参照を回避するための他の一般的な人。

AC_CHECK_LIBマクロの詳細については、ドキュメント ページを確認してください

于 2013-02-18T13:57:08.190 に答える