12

Embarcadero RAD Studio 2010(C ++)を使用しています。プロジェクトファイル(.cbproj)には、.bpisまたは.libsのリストを含む5つの異なるタグがあります。これらのライブラリファイルの各リストがリンカーによってどのように使用されるかについての情報が必要です(ランタイムパッケージの有無にかかわらずビルドする場合)。

LinkPackageImports

LinkPackageStatics

AllPackageLibs

PackageLibs

PackageImports
私はすでにこの最後のものを理解していると思います。これには、IDEのプロジェクトプロパティから設定できるランタイムパッケージのリストが含まれています。

この質問の動機は、アプリケーションから不要な依存関係を排除しようとしていることです。.cbproj内のこれらの5つのタグには、それぞれ異なるlibとbpiの任意の組み合わせが含まれているようです。私が知っているいくつかのライブラリは私が必要としない、そして私が私が必要と思ういくつかのライブラリは私が必要としない。一部のリストから一部のライブラリを削除しても効果がないようですが、他のリストから他のライブラリを削除すると、フォームのリンカーエラーが発生します[ILINK32 Error] Fatal: Unable to open file 'FILENAME.OBJ'

私はすべてのリンカーの問題をゆっくりと解決していますが、これら5つのリストの1つにライブラリ名を含めるときに、リンカーに何をするように指示しているかを正確に知ることは非常に役立ちます。

4

2 に答える 2

19

この情報はどこかに存在しているはずですが、フォーラムやドキュメントで見つけることができませんでした。私は自分の実験からこれらすべてを推測しましたが、より公式な情報源からのフィードバックをいただければ幸いです。

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タグを削除します。

于 2012-09-14T19:27:08.870 に答える
0

問題の解決策がすでに見つかっていることを願っていますが、使用しているすべてのプロジェクトについて、Build With Runtime Packageを無効にし、Use Dynamic RTLを無効にして、DebugからReleaseビルドに変更するだけでよいと思います(http:// bcbjournal.org/articles/vol4/0009/Building_stand-alone_EXEs.htm?PHPSESSID=08f2084c32d5fce05f13518fef23f358)。

一部のバイナリ(dll、lib ...)など、変更できないコンポーネントがある場合、それらが以前にビルドされていれば、無効になっているオプションに依存することになります...

ビルドする前に、プロジェクトからすべての*.objと*.exeを削除することもお勧めします(一部のサードパーティモジュールの必須として提供されている場合を除く)...一部の古いC ++ Builderバージョンには、その上で解決されるビルドの問題がいくつかあります。仕方。

于 2012-09-10T13:52:16.953 に答える