これまでコンパイルとリンクに問題がなかった C++ プロジェクトがありますが、最近のコンピューターのクラッシュにより、Visual Studio とすべての VCPKG パッケージを含むすべてを再インストールする必要がありました。(私は VS 2022 プレビューを使用しており、以前はそうでした。)
私のプロジェクトでは、Intel の TBB や Armadillo (特に OPENBLAS に依存) など、多くの静的にリンクされたライブラリを使用しています。ただし、プロジェクトが静的リンクを使用している場合でも、OPENBLAS と TBB の両方で DLL をリンクする必要があることに注意してください。
現在、以前に機能していたのと同じプロジェクト プロパティを使用して同じプロジェクトをコンパイルしており、次のような LNK2005 エラーが常に発生しています。
DllMain はすでに openblas.lib(memory.c.obj) で定義されています..... tbb_debug.lib(tbb_main.obj)
リンクの順序を切り替えると、エラーが次のように変わるだけです
DllMain は既に tbb_debug.lib(tbb_main.obj) で定義されています... openblas.lib(memory.c.obj)
[注: リリース構成とデバッグ構成でリンクするのと同じ問題です。]
今、私が理解できないのは、なぜこれが起こるのかです。プロジェクトが複数のインポートされた DLL に依存するのは当然のことです。また、DLL が DllMain エントリ ポイント関数をエクスポートするのはごく普通のことです。
PC がクラッシュしたため、すべてを最新バージョンにアップグレードすることを余儀なくされましたが、これがどこかに問題をもたらしたのではないでしょうか。
これは、2 つの異なる DLL からの 2 つの DllMain 関数を競合していると見なす MSVC のバグですか?
これが実際の競合である場合、サード パーティの DLL を使用して大規模なプロジェクトを構築している人々に、これが頻繁に発生しない理由を説明してもらえますか?
VCPKG の新規インストールを含むすべてを試しましたが、何も役に立ちません。
これを取得してリンクを完了するための唯一のオプションは、/FORCE:MULTIPLE オプションを使用することです。これは、欠陥のある実行可能ファイルを作成する可能性があるため、あまり好きではありません。
ここでアドバイスをいただければ幸いです。