0

nmUnix でコマンドを使用して修正することになっているリンク エラーがあります。

次のリンク エラーが発生した場合: 、そのオブジェクト ファイルでundefined reference to 'program_name'実行すると、シンボルはシンボル テーブルに次のように表示されます: 。nmprogram_nameU program_name

program_nameは未定義であり、元のオブジェクト ファイルに含める必要がある別のオブジェクト ファイルで定義されています。私の質問は、それがどのオブジェクトファイルであるかをどのように見つけることができますか? それは可能ですか?ディレクトリにたくさんのオブジェクト ファイルがあり、そのうちの 1 つになります。それらすべてを試すには多すぎます。

4

3 に答える 3

3

はい。U出力内の a の代わりにT、シンボルが定義されているオブジェクト ファイル内に (「テキスト セグメント」の) a が見つかります。このようなものは(bashで)動作するはずです:

for f in *.o; do if (nm "$f" | grep 'T program_name'); then echo "$f" matches; fi; done

ここでは、すべての *.o ファイルをループしており、シンボルが定義されているファイルのファイル名が出力されます。

于 2012-10-15T17:45:12.980 に答える
1

あなたはこれを行うことができます:

$ nm *.o 

出力で を探します (オブジェクト ファイルに拡張program_name子があると仮定します)。.o

于 2012-10-15T17:39:33.070 に答える
0

nm -o *.o |grep program_nameシンボルのタイプが「T」である .o ファイルを探してみてください(関数名であると仮定します)。nmの-oオプションは、各行にファイル名のプレフィックスを付けます。お使いの OS によっては、 nm にこのオプションがある場合とない場合があります (ある場合もあります-A) ので、マンページを確認してください。まったくない場合は、次のようなシェル for ループを作成する必要があります。

for obj in *.obj; do 
  echo $obj:
  nm $obj | grep program_name
done`
于 2012-10-15T17:48:12.210 に答える