そのようなプロジェクトの依存関係があるとしましょう:
- SerialPortDemo (EXE) --> SerialPort (DLL) -> ByteIo (DLL)。
- XYZ-App (EXE) -> XYZ-Lib (DLL) -> ByteIo (DLL)
各 DLL プロジェクトには、2 つのフォルダーinclude
とsrc
. 非パブリック ヘッダーとともにinclude
、パブリック インターフェイス ヘッダーと実装が含まれます。src/
PUBLIC、PRIVATE、および INTERFACE キーワードを使用した CMake のtarget_include_directoriesに慣れているので、ByteIo プロジェクトを使用するために、消費者がインクルード ディレクトリの独自のリストに追加する必要があるかどうか、およびどのディレクトリを追加する必要があるかを ByteIo プロジェクトに伝えたいと思います。同じことがリンクされたライブラリにも当てはまります - 繰り返しますが、CMakeのtarget_link_librariesと同じです。
現在、ByteIo のヘッダーに応じて、ByteIo のインクルード ディレクトリをすべてのプロジェクトに直接または間接的に手動で追加する必要があります。たとえば、SerialPort.dll プロジェクトのクラス SerialPort は、ByteIo.ddl プロジェクトで定義された ByteIo をサブクラス化するため、プロジェクト SerialPortDemo.exe は、ByteIo と SerialPort の両方のプロジェクトの (パブリック) インクルード パスを追加する必要があります。上記の小さな例 (SerialPortDemo、SerialPort、XYZ-App、および XYZ-Lib) でさえ、これは膨大な時間の無駄であり、非常にエラーが発生しやすいものです。
動作しません:
- オプション セット: DLL プロジェクトのコンシューマー プロジェクトの場所に応じて相対インクルード パスを変更する必要があるため、使用するには制限が多すぎます。これまでに思いついた唯一の回避策は、オプション セットのインクルード パス リストにフル パスを追加することです。これは受け入れられません。
- 環境変数: 非常に特定の場所でプロジェクトをチェックアウトすることを余儀なくされたり、同じマシンでプロジェクトを複数回チェックアウトする可能性を否定したりするため、受け入れられる解決策ではありません。
Embarcadero C++Builder XE8 は、この問題に対して健全で保守可能なソリューションを提供しますか?