Embarcadero RAD Studio XE3 (Use Runtime Packages をオフにして) で C++ プロジェクトをリンクすると、次の形式のエラーが発生することがあります。
[ilink32 Error] Fatal: Unable to open file 'FOO.OBJ'
何が原因なのか理解しています。これは#pragma link
、リンカが unit を必要とする原因となる暗黙的な参照がコードに (通常は a を介して) あるためですFOO
。
VCL ソースを見ると、通常はFOO.PAS
にコンパイルされる が見つかりますFOO.DCU
。これは、リンカが探しているが見つからないコンパイル済みユニットです。
このコンパイル済みユニットが VCL ライブラリの 1 つにあることは知っていますが、どのライブラリを見つけるかはわかりません。たとえば、VCL.LIB、RTL.LIB、BCBIE.LIB (など) にはどのユニットが含まれていますか?
ユニット名が与えられた場合、それが含まれている VCL ライブラリを知りたいです。それがわかっている場合は、適切な .lib ファイルをLinkPackageStatics
cbproj ファイルのタグに追加するだけで、すべてが正常にリンクされます。
そのユニットのドキュメントに表示されていればいいのですが、そこにはありません。現在、試行錯誤して適切なライブラリを見つける必要がありますが、どの VCL ユニットがどの VCL ライブラリにリンクされるかを示す公開リストがどこかにあることは確かです。
そのようなリストはどこにありますか?
(ちなみに、IDE の通常の使用法では、開発者はこれを知る必要がないことを知っています。通常、これは IDE が処理します。しかし、.cbproj が間違ってマージされた場合に、この情報が必要になることがあります。または手動で誤って編集したり、IDE の通常の使用を超えた他の多くの理由で編集したりします)。
編集:ありがとう!tlib はまさに私が必要としていたものでした。私はシェル スクリプトがかなり苦手ですが、含まれている各ユニットの名前の横にライブラリの名前を出力する小さなシェル スクリプトを作成しました。
#!/bin/bash
while [ "$1" != "" ]; do
name=$(basename "$1")
tlib /L $name | grep size | awk -v name=$name '{print name, "\t", $1}'
shift
done
次に、関心のあるすべての .lib でスクリプトを実行し、探しているユニット (SysUtils など) を grep してスクリプトを呼び出すことができます。
find . -name "*.lib" -exec libunits.sh {} \; | grep SysUtils