1

いくつかのライブラリを構築し、これらのライブラリと他のさまざまなシステムライブラリの通常のコレクションを使用していくつかのアプリケーションをコンパイルするclang++3.2を使用してUbuntu12.04で開発されたC++ソ​​ースツリーがあります。2つのパズル。クライアントは、clock_gettime()への未定義の参照でコードのビルドに失敗したと報告しています。案の定、ビルドロジック(scons)に必須の「-lrt」を含めませんでした。

最初のパズル:これは、「-lrt」をどこにも指定しなくても、システム上で文句なしに正しくコンパイル、リンク、実行されます。このシンボルはどのようにして正しく解決されますか?アプリケーションがそれ自体にlibrtを必要とするダイナミックライブラリにリンクしているためだと思いますが、これが発生する理由の背後にあるロジックがわかりません。

2番目のパズル:「-lrt」なしでclock_gettime()がどのように解決されるかについて十分な説明があるとすると、なぜこれが私のシステムで発生するのに、クライアントの非常によく似た設定では発生しないのでしょうか。

「...謎に包まれた謎に包まれた謎の中に」---ウィンストン・チャーチル

ここで実際に何が起こっているのかを明らかにするためのツールの提案は大歓迎です。

4

1 に答える 1

3

SUSv4 から (ユーティリティ/c99):


-l rt

このオプションは<aio.h><mqueue.h><sched.h><semaphore.h>、および<spawn.h>で参照されているすべてのインターフェイス、 でオプションとしてマークされている<sys/mman.h>インターフェイス、 で ADV (Advisory Information) としてマークされているインターフェイス、および で接頭辞およびで<fcntl.h>始まるインターフェイスを使用可能にします。このオプションがない場合、実装はこのライブラリを検索できます。clock_time_<time.h>


POSIX でこの動作が許可されている理由を少なくとも正当化するには、上記で十分だと思います。

この点で、関連するシステムが異なる可能性が最も高いです。たとえば、あなたのためclock_gettime()に実装されているかもしれませんが、あなたのクライアントのために実装されているかもしれません. チャンスを逃さないでください。ポータブルを使用して、問題を忘れてください。libclibrt-l rt

より明白な例は-l xnetで、これは POSIX に従って同様に動作しますが、少なくとも Gentoo、Debian、および Ubuntu Linux システムでは、 でコンパイルすると-l xnet実際にエラーが発生します。( libxnetUNIX ソケット インターフェイスの実装が含まれていると言われています。)

この問題をさらに調査したい場合はldd、GNU/Linux システムで試してください。lddバイナリの動的依存関係を表示する必要があります。私はそれclock_gettime()が単純に実装されているに違いないlibc.so.

于 2012-10-16T05:23:41.097 に答える