4

Irix 6.5 を実行している SGI で FORTRAN と C でプログラミングしていますが、これはすべての Unix 系システムに適用できるはずです。「未解決のテキスト シンボル」リンク エラーが発生した場合、自分のプログラムにリンクする必要があるライブラリを見つけるにはどうすればよいですか? リンカーから見たものの例を次に示します。

ld32: ERROR  33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a

どのライブラリが必要かを知る必要がありますか?それとも、これを理解するのに役立つツールやコマンドはありますか?

4

5 に答える 5

9

次のコマンドを使用してnm、共有ライブラリから動的シンボルを一覧表示できます。

nm -D /lib/libc.so.6

次にgrep、探しているシンボルを探します。スタティック ライブラリの -D を省略します。これをループまたは xargs で使用して、複数のライブラリをスキャンできます。

私は通常、Googleを使用します(シンボルが公開ライブラリからのものであると仮定します)。

于 2008-11-14T17:40:20.730 に答える
3

nmRobert Gambleの回答のように)を使用することは、あなたの質問に対する正しい答えです。秘訣は、ライブラリを探す場所を知ることです。あなたのプログラムは何をしますか?大量の数値が発生している場合は、数学ライブラリ(LAPACKやBLASなど)に対してリンクしている必要があり、そこで調べ始めたいと思うかもしれません。Web検索も役立ちます-私はお気に入りの検索エンジンに「ortho2」と入力し、それが含まれていることを示唆するこのドキュメントを入手しましたlibfgl.a

検索するときは、おそらく末尾の下線を省略する必要があることに注意してください。通常、これはコンパイラによってルーチン名に追加されます。

于 2008-11-14T17:55:56.657 に答える
3

これを Robert Gamble の回答に追加する誘惑に抵抗しました。これを補足と考えてください。

「任意の一致」を使用しても問題ないと単純に想定しないように注意してください。別の SO の質問では、コードの一部が Windows から Unix に移動され、Windows コードgetch()が入力から 1 文字を読み取るために使用されるケースがありました。ユーザーはこれに似たプロセスを経て、図書館getch()の Unix で見つけました。cursesそのため、ユーザーはcursesライブラリにリンクし、コード コアがダンプされた理由を疑問に思いました。問題は、getch()実際に使用されている は、適切な初期化が行われたことを前提としており、適切な初期化が行われていないことです。実際、それはおそらく必要なルーチンではありませんでした。

Solaris ではnm、ライブラリ名と、シンボルを含むライブラリ内のオブジェクト ファイルを表示するオプションがあります (これらは-r、ライブラリ名とライブラリ-R内のオブジェクト用です)。

C++ の壊れた名前にも注意してください。このortho2例は明らかに C++ のマングルではありません。

于 2008-11-15T16:55:48.853 に答える
2

私は少しlookforスクリプトを持っています。func_name の検索を入力してください

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end
于 2008-11-17T15:56:49.390 に答える
2

それがortho2である可能性のある標準関数である場合、マニュアルページはそれがどのライブラリにあるかを示します.

于 2008-11-15T17:21:27.723 に答える