我正在使用Qt(gui lib),VTK(圖形庫)和另一個如此晦澀的庫的C++項目,我不會提及它的名稱,而是將其稱爲LIB_X。該項目使用QT爲gui組件和VTK(更確切地說是由VTK提供的支持Qt的QVTKWidget擴展)來渲染幾何體,並使用LIB_X來收集和處理幾何體。VC++庫衝突問題
問題是,事實證明,LIB_X實際上使用VTK(在哪裏以及如何,我不知道它是封閉的源代碼)。起初沒有問題,編譯兩個庫鏈接都很好,但在某些時候,我調用了一個(並且非常需要)LIB_X函數,並且編譯導致了一堆關於已經定義的VTK lib/obj的'blah blah'在LIB_X DLL'錯誤。
例如(並注意這與/ FORCE:多所以這是一個警告在這裏,讓我知道如果你想要的錯誤,而不/ FORCE:多,我會後):
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)" ([email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in vtkCommon.lib(vtkInformationDoubleVectorKey.obj);
我嘗試使用/ FORCE: MULTIPLE,它起初似乎是一個奇蹟,但是我得到的代碼中的隨機錯誤通常會導致堆錯誤。我決定從主項目中刪除對LIB_X的所有引用,並創建一個靜態庫來處理所有LIB_X的東西。我不是C++專家,所以我不確定在使用預編譯庫時它是如何處理庫衝突的,但是當我將靜態庫鏈接到我的主項目時仍然收到lib衝突錯誤,所以我仍然必須使用/ FORCE:MULTIPLE。
一旦我有了靜態庫,好像隨機錯誤消失了,我可以通過靜態庫在主項目中使用LIB_X方法做很多事情,但是無處不在,我添加了一個新的數據成員到我的主要項目的類(一個std ::向量的雙打),突然間我在我的一個靜態庫的方法中得到了一個堆錯誤。如果我註釋掉了新的數據成員,靜態庫的方法會運行良好。我討厭給當前的錯誤,因爲老實說,我不確定是否檢查它是值得的,但在這裏它是無論如何,以防萬一它可以幫助:
注意:它崩潰xutility約151行,彈出斷言: 「文件:dbgheap.c行:1279表達式:_CrtIsValidHeapPointer(pUserData)」
的錯誤出現添加矢量矢量雙到矢量矢量矢量雙,拍擊的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
當我向主項目中添加一個新的數據成員時,它只在這裏崩潰(與靜態分開lib!)註釋掉新的數據成員會將錯誤消除。
std::vector<std::vector<std::vector<double>>> _geometry;
因此,/ FORCE:MULTIPLE看起來不好,我得到的隨機錯誤對我來說沒有意義。還有其他解決方案嗎?我擰了嗎?有什麼我可以用LIB_X連接VTK做什麼?
我在想,如果這樣的事情能夠發揮作用,我會嘗試進行測試。 到目前爲止,我的問題是#2,從包裝中刪除libx頭。我需要libx中的數據成員在我的類中,他們需要libx命名空間來聲明。該變量可能看起來像Libx :: DataStructA _dataStructA;我無法創建類原型,因爲它需要名稱空間,而且我不能使用名稱空間,因爲我沒有頭部訪問,但是當涉及到可以解決此問題的名稱空間時,我可能不知道有什麼? – ferr 2010-01-10 18:33:24
更多關於我上面的評論,我不確定它是否與名稱空間有關,它只是一個前向聲明問題,完全在很多級別上。我試圖轉發聲明的libx類沒有在我的類中聲明爲一個指針,所以它爲此提出了一個合適的解決方案。將它聲明爲指針似乎沒有多大幫助。 – ferr 2010-01-10 19:18:49
好吧,在做了大量的搜索和搜索後,它看起來像你可以在類似這樣的命名空間中聲明一個類:namespace LibX {class libxClass; },這樣我可以稍後聲明一個LibX :: libxClass。我現在遇到的問題是我正在重新定義錯誤。我的.cpp文件中包含libxClass.h文件,它抱怨在我的頭文件和libxClass.h文件中有一個定義。最重要的是,我試圖轉發聲明的'class'實際上是一個類的typedef ..不知道對這種情況有什麼影響。 – ferr 2010-01-10 22:30:31