そのため、CMake を使用してソフトウェアを構築するのはかなりの頭痛の種です。
PNG機能をサポートするためにzlibとlibpng(両方とも静的で、これらを事前に構築した)ライブラリを必要とするサードパーティのライブラリ(dlib)を静的に構築しています。COTS dlib ライブラリによって提供される CMakeFile は、基本的なことを行っています。
target_link_libraries( dlib ${dlib_required_libs})
これにより、すべてのライブラリが「一般的な」ライブラリとして構成され、最終的にリリース ビルドとデバッグ ビルドの両方に使用されます。
これは Linux では問題になりませんが、Windows には、ランタイム ライブラリ (/MT または /MD または /MTd または /MDd) を指定する優れた "機能" があります。これらのフラグが一致しないと、リンク時に複数のシンボル定義エラーが発生します。つまり、libpng が /MT でビルドされていて、私のソフトウェアが /MTd を使用している場合、それらは互換性がありません。
これを軽減するために、zlib と libpng の 2 つのビルド バージョンがあります。1 つはリリース ビルド用の /MT フラグを使用するセットで、もう 1 つはデバッグ ビルド用の /MTd フラグを使用します。これらは、使用されている target_link_libraries の最適化/デバッグ フラグを使用して、自分のソフトウェアに喜んでリンクします。ただし、dlib (サード パーティ) は、CMakeFile が記述されている方法で、zlib および libpng ライブラリのリリース セットのみをリンクしています。
私の主な質問は、提供されている CMakeFile を変更せずにリンクしている dlib を「オーバーライド」できる方法はありますか? 私は dlib_LIB_DEPENDS を上書きしようとしましたが、必死になってキャッシュに入れようとしましたが、役に立ちませんでした。