2

プロジェクトをコンパイルして自分のシステムで実行すると、問題なく動作します。

これを git にアップロードし、管理者にサーバーで実行するように依頼したところ、undefined reference to 'clock_gettime'. -lrtこのエラーは、ライブラリをオプションでリンクすることで解決できます。同様の問題が以前に発生しましたが、それはオプションmath.hを使用してライブラリをリンクすることに関連していました。-lm

このような問題に遭遇したり、管理者の前で恥ずかしく感じたりしないように、リンクするすべてのライブラリを見つける方法はありますか? リンクするすべてのライブラリを決定する方法。これには思考プロセスがありますか?

4

2 に答える 2

1

一部のmanページでは、使用する必要があるヘッダーとライブラリの両方について言及しています。(残念ながら、これはすべてのページに当てはまるわけではありません。)

たとえば、 を見てくださいman 3 signal。私のシステムでは、そのページLIBRARYの上部に のセクションがありStandard C Library (libc, -lc)、その後に のSYNOPSISセクションがあり#include <signal.h>ます。

その他の戦略には次のものがあります。

  • インストールされたライブラリの中から名前への参照を検索するために、シェル ループでstringspiped to を鈍く使用します。egrepこれは、一般的な名前に対して多くの誤検知を返す可能性がありますが、単一の英語の単語と一致しない複雑な関数名に対しては非常にうまく機能します。

  • 繰り返しのコンパイルとリンク。単一の関数を解決しようとしている場合は、その関数を呼び出す小さなプログラムを作成し、シェルまたは makefile ループを使用して、システム上の各ライブラリをテストします (他の/usr/lib場所の最も可能性の高い候補の小さなリストから始めます)。ある時点でビルドが成功し、適切なライブラリが表示されます。この方法ではセットアップに少し手間がかかりますが、作成したインフラストラクチャは将来的に再利用するのも非常に簡単です。

  • リンカーのツール ( otoolMac OS X、objdumpSolaris readelf、Linux など) を使用してバイナリを繰り返し検査します。たとえば、特定の名前 ( otool -v -t -p _symbolMac OS X の場合) から始まるライブラリのテキスト セクションを逆アセンブルしてみてください。

于 2012-06-28T02:55:03.690 に答える
1

*nix ベースのマシンの場合ldd、実行可能ファイルで共有ライブラリの依存関係が出力されます。

于 2012-06-28T02:06:20.987 に答える