私は、Qt(gui lib)、VTK(graphics lib)、およびその名前を言及せず、代わりにLIB_Xと呼ぶ非常にあいまいな別のライブラリを使用するC++プロジェクトに取り組んでいます。プロジェクトでは、GUIコンポーネントにQtを使用し、ジオメトリのレンダリングにVTK(より正確には、QtをサポートするVTKによって提供されるQVTKWidget拡張機能)を使用します。LIB_Xを使用してジオメトリを収集および操作します。
問題は、LIB_Xが実際にVTKを使用していることが判明したことです(どこで、どのように、それはクローズドソースであるかはわかりません)。最初は問題はありませんでした。両方のライブラリをリンクしてコンパイルしても問題はありませんでしたが、ある時点で特定の(そして非常に必要な)LIB_X関数を呼び出してコンパイルすると、すでに定義されているVTK lib/objに関する何かがたくさん発生しました。 LIB_Xdllのエラーで。
例(これは/ FORCE:MULTIPLEを使用しているため、ここでは警告です。/FORCE:MULTIPLEなしでエラーが必要な場合はお知らせください。投稿します):
1>LIB_X.lib(LIB_X.dll) : warning LNK4006: "public: __thiscall std::vector<double,class std::allocator<double> >::~vector<double,class std::allocator<double> >(void)" (??1?$vector@NV?$allocator@N@std@@@std@@QAE@XZ) already defined in vtkCommon.lib(vtkInformationDoubleVectorKey.obj);
/ FORCE:MULTIPLEを使用してみましたが、最初は奇跡のようでしたが、コードにランダムなエラーが発生し、ほとんどの場合ヒープエラーが発生します。メインプロジェクトからLIB_Xへのすべての参照を削除し、すべてのLIB_Xのものを処理する静的libを作成することにしました。私はC++の専門家ではないので、コンパイル済みのlibを使用しているときにlibの衝突をどのように処理するかはわかりませんが、静的libをメインプロジェクトにリンクするときにlibの衝突エラーが発生するので、それでも/ FORCE:MULTIPLEを使用する必要があります。
静的ライブラリを取得すると、ランダムエラーがなくなったように見え、静的ライブラリを介してメインプロジェクトのLIB_Xメソッドで多くのことを実行できましたが、どこからともなく、メインプロジェクトに新しいデータメンバーを追加しました。 class(std :: vector of doubles)を実行すると、静的ライブラリのメソッドの1つで突然ヒープエラーが発生しました。新しいデータメンバーをコメントアウトすると、静的ライブラリのメソッドは正常に実行されます。正直なところ、それを調べる価値があるかどうかわからないので、現在のエラーを与えるのは嫌いですが、それが役立つ場合に備えて、とにかくここにあります:
注:約151行目でxutilityにクラッシュし、アサーションがポップアップ表示されます: "file:dbgheap.c line:1279 expression:_CrtIsValidHeapPointer(pUserData)"
エラーは、ベクトルベクトルdoubleをベクトルベクトルベクトルdoubleに追加した後に発生し、push_back行でクラッシュします。
std::vector<std::vector<double>> tmpVec;
for(srvl_iter = srvl.begin(); srvl_iter != srvl.end(); ++srvl_iter)
{
tmpVec.push_back((*srvl_iter).getControlPoints());
}
this->_splines.push_back(tmpVec); //CRASH
ここでクラッシュし始めたのは、メインプロジェクトに新しいデータメンバーを追加したときだけです(静的ライブラリとは別に!)。新しいデータメンバーをコメントアウトすると、エラーがなくなります。
std::vector<std::vector<std::vector<double>>> _geometry;
したがって、/ FORCE:MULTIPLEは悪いように見えますが、私には意味をなさないランダムエラーが発生します。他の解決策はありますか?私はねじ込まれていますか?LIB_XのVTKのリンクでできることはありますか?