この情報はどこかに存在しているはずですが、フォーラムやドキュメントで見つけることができませんでした。私は自分の実験からこれらすべてを推測しましたが、より公式な情報源からのフィードバックをいただければ幸いです。
PackageImports-これは、IDEのプロジェクトオプションに「ランタイムパッケージ」リストとして表示されます。IDEの「ランタイムパッケージ」リストに何かを追加または削除すると、このタグはそれを反映するように更新されます。このタグが空であるか、cbprojファイルにない場合、RADStudioにインストールされているすべてのデザインタイムパッケージに関連付けられているすべてのランタイムパッケージのリストが自動的に入力されます。このタグは、コマンドラインからビルドする場合は効果がありません。IDEは、実際にリンクしようとしているライブラリを計算するためだけにPackageImportsタグを使用しているようです。
このリストにライブラリを配置しても、(それ自体では)新しい依存関係は作成されません。基本的に、IDEに「これらのライブラリのいずれかをリンクする必要がある場合は、静的ではなく動的にリンクする」ように指示しています。
AllPackageLibs-これは、プロジェクトが正常にリンクするために必要であると考えられるすべてのライブラリのIDEのリストです。このタグは、コマンドラインからビルドする場合は効果がありません。プロジェクトに変更を加えると(ファイルを追加するなど)、IDEはAllPackageLibsの内容を再計算しようとします。#pragma link
プロジェクトのファイルで見つかったsからこれを計算します。(これは、プロジェクト内のすべてのをコメントアウトし#pragma link
、プロジェクトを変更したときにAllPackageLibsが再作成されなかったことに注意して決定しました。)
LinkPackageStatics -IDEがAllPackageLibsでPackageImportsに表示されないライブラリを検出した場合、そのライブラリを静的にリンクすることを決定します。その場合、IDEはライブラリ名をLinkPackageStaticsに自動的にコピーします。IDEからビルドする場合、このタグは常にAllPackageLibsおよびPackageImportsから再計算されるため、ここで手動で追加したものはすべてリンカーによって無視されます。ただし、コマンドラインからビルドする場合、このタグ内のすべてのファイル(.libsまたは.bpis)がリンクされ、ilink32のコマンドラインの「objfiles」セクションに表示されます。
LinkPackageImports -IDEは、PackageImportsに表示されるAllPackageLibsでライブラリを検出すると、そのライブラリを動的にリンクすることを決定します。その場合、IDEはライブラリ名(拡張子は.bpi)をLinkPackageImportsにコピーします。IDEからビルドする場合、このタグは常にAllPackageLibsおよびPackageImportsから再計算されるため、ここで手動で追加したものはすべてリンカーによって無視されます。ただし、コマンドラインからビルドする場合、このタグ内のすべてのファイル(.libsまたは.bpis)がリンクされ、ilink32のコマンドラインの「libfiles」セクションに表示されます。
PackageLibs -PackageLibs(.libsまたは.bpis)内のすべてのものは、IDEによってLinkPackageStaticsに直接追加されます(PackageImportsに含まれるものに関係なく)。これらのライブラリは、AllPackageLibsからのライブラリの前にあるLinkPackageStaticsに追加されます。コマンドラインビルドは、このタグの影響を受けません。
IDEがLinkPackageStaticsまたはLinkPackageImportsを変更することを期待しているときはいつでも、最初にIDEでプロジェクトをビルドする必要があります。次に、プロジェクトオプションに小さな変更を加えます(そして元に戻します)。次に、プロジェクトを保存します。この時点で、IDEはLinkPackageStaticsまたはLinkPackageImportsをcbprojに書き込み、プロジェクトをコマンドラインでリンクできるようにします。
ライブラリをリンクする他の方法-これらの4つのタグを含まない、リンクするファイルを指定する方法もいくつかあります。.libをプロジェクトに直接追加するか(プロジェクトを右クリック|追加...)、#pragma comment (lib, "libraryname.lib")
プロジェクトでコンパイルされたファイルの1つに行を挿入することができます。
.libをプロジェクトに直接追加すると、リンクされる他のすべてのライブラリとともにコマンドラインに表示されます。このトリックを使用する#pragma comment
と、ライブラリはコマンドラインに表示されず、リンクされていることを確認できません(tdump
エクスポートを使用して確認する場合を除く)。
概要
コマンドラインからリンクする場合、効果のあるcbprojタグ(これら5つのうち)は、LinkPackageStatics(objfilesセクションに追加するlibs)とLinkPackageImports(libfilesセクションに追加するlibs)のみです。これらのタグの内容は、IDEによってAllPackageLibsおよびPackageImportsから計算されますが、コマンドラインからリンクする必要がある場合は、.cbprojで手動で設定できます。
IDEからリンクする場合、通常はIDEでライブラリを管理する必要があります。IDEが自動的に検出しないライブラリを追加する必要がある場合は、外部エディタで.cbprojファイルを開き、不足しているライブラリをAllPackageLibsタグに追加する必要があります。ライブラリを動的にリンクする場合は、ライブラリ名を「ランタイムパッケージでビルド」リスト(別名PackageImports)にも追加する必要があります。
すべてのライブラリを動的にリンクしていることを確認したい場合は、.cbprojファイルのLinkPackageStaticsタグを確認してください。そのリストにライブラリが含まれている場合、それらは静的にリンクされています。これを修正するには、それらのライブラリの名前をPackageLibsタグにコピーします(そしてそれらの拡張子をbpiに変更します)。次に、LinkPackageStaticsタグを削除します。