私は、オープン ソース ライブラリを利用していくつかの面倒な作業を行うコードをいくつか書きました。この作業は、単体テストと cmake を使用して Linux で行われ、Windows への移植に役立ちました。両方のプラットフォームで実行する必要があります。
私は Linux と cmake が好きで、ビジュアル スタジオ ファイルが自動的に生成されるのが好きです。今のところ、Windows ではすべてがコンパイルされ、リンクされ、テスト実行可能ファイルが生成されます。
ただし、この時点に到達するには、マニフェスト ファイルと再頒布可能パッケージについてすべてを学びながら、数日間 Windows と格闘しなければなりませんでした。
私の理解が進む限り:
VS 2005 では、Microsoft は Side By Side DLL を作成しました。これの動機は、以前は複数のアプリケーションが同じ dll の異なるバージョンをインストールし、以前にインストールされて動作していたアプリケーションがクラッシュする (つまり、「Dll Hell」) ことです。サイド バイ サイド DLL はこれを修正します。これは、どのバージョンを実行するかを指定する「マニフェスト ファイル」が各実行可能ファイル/DLL に追加されるようになったためです。
これはすべて順調です。アプリケーションが不可解にクラッシュすることはなくなりました。でも...
Microsoft は、Visual Studio のリリースごとに新しいシステム dll のセットをリリースしているようです。また、前述したように、私はサードパーティのライブラリにリンクしようとしている開発者です。多くの場合、これらは「プリコンパイル済み dll」として配布されます。では、あるバージョンの Visual Studio でコンパイルされたプリコンパイル済み DLL が、別のバージョンの Visual Studio を使用するアプリケーションにリンクされるとどうなるでしょうか。
私がインターネットで読んだことによると、悪いことが起こります。幸いなことに、私はそこまで到達することはありませんでした.実行可能ファイルを実行しているときに「MSVCR80.dllが見つかりません」という問題が発生し続けたため、このマニフェスト全体の問題への進出を開始しました.
最終的に、これを機能させる唯一の方法 (すべてを静的にリンクする以外に) は、すべてのサードパーティ ライブラリを同じバージョンの Visual Studio を使用してコンパイルする必要があるという結論に達しました。つまり、プリコンパイルされた dll を使用しないでください。新しいdllを構築し、代わりにそれを使用してください。
これは実際に本当ですか?私は何か見落としてますか?
さらに、これが事実であると思われる場合、Microsoft は悪意のある理由で意図的にこれを行ったと考えずにはいられません。
すべてのプリコンパイル済みバイナリが壊れて、プリコンパイル済みバイナリの使用が不必要に難しくなるだけでなく、サード パーティの独自ライブラリを使用するソフトウェア会社で働いている場合、彼らがビジュアル スタジオの最新バージョンにアップグレードするたびに、会社は必ず同じことをしないと、コードが実行されなくなります。
余談ですが、Linuxはこれをどのように回避しますか? 私はそれで開発することを好み、リンクの仕組みを理解していると言いましたが、この種の低レベルの共有ライブラリのバージョン管理の問題に遭遇するほど長い間アプリケーションを維持していません。
最後に、要約すると、この新しいマニフェスト スキームでプリコンパイル済みバイナリを使用することは可能ですか? もしそうなら、私の間違いは何ですか?そうでない場合、Microsoft は、これによりアプリケーション開発が容易になると正直に考えていますか?
更新 - より簡潔な質問: Linux はどのようにしてマニフェスト ファイルの使用を回避していますか?