我的工作C++项目使用的脱(gui lib),VTK(图形lib)和另一个图书馆是如此模糊的我不会提及它的名字,而是将它叫LIB_X.该项目采用夸脱的图形用户界面组件和VTK(更确切地说QVTKWidget扩展提供VTK,支持建)用于呈几何..它使用LIB_X收集和操作的几何形状。

问题是,事实证明,LIB_X实际使用VTK(在哪里以及如何,我不知道,这是封闭源)。在第一次没有问题,编撰与两库链接进行得很顺利,但在某些时候,我叫一定(和高度需要)LIB_X功能和编纂,导致一堆'等等等等等一些关于VTK lib/obj已经定义LIB_X dll'错误。

例如(注意这/力:多种因此它是一个警告这里,让我知道如果你想的错误,而不/力:多和我会后):

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);

我试图使用/力:多和它似乎是一个奇迹,但我收到的随机误差在代码,主要是给堆的错误。我决定删除所有提及LIB_X从主要项目,并创建了一个静态lib会处理所有LIB_X的东西。我不C++的专家,所以我不能肯定如何处理lib冲突当你使用预先编制lib,但我仍然收到lib冲突的错误,当联我的静态lib入我的主要项目,所以我必须仍然使用/力:多个。

一旦我有静态lib它似乎是随机误差已经走了,我能够做很多LIB_X方法的主要项目通过静lib,但是从哪儿冒出来,我增加了一个新的数据成员给我的主要项目类别(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; 

因此,/力:多似乎不好,我得到的随机误差,只是没有意义我的。是否还有其他的解决方案?我拧?有什么我可以做LIB_X的联VTK?

有帮助吗?

解决方案

我遇到一群 LNK4006 错误的时候联系我的应用程序的库(它叫库LIB_Y),大量使用 std::vector<std::string>, 我还在做我的应用程序。后一点的实验我发现一个解决方案的工作--包LIB_Y在一个单独的DLL呼吁LIB_Y(LIB_Y_WRAPPER,说),以及随后的链接,主要的应用程序对LIB_Y_WRAPPER.

试试我的建议你将需要:

  1. 改变你的"静态lib处理所有LIB_X的东西",从静态LIB项目成DLL项目(我将呼叫LIB_X_WRAPPER).
  2. 确保该标题的文件的LIB_X_WRAPPER不包括任何LIB_X头文件。这个是 真的很重要 因为包装需要完全隔离开你的应用的数据类型声明的LIB_X标题的文件(例如 std::vector<double>).只有参阅LIB_X的头文件内的源文件LIB_X_WRAPPER.
  3. 改变《宣言》的所有类别和职能在你的静态lib,以确保它们的出口从DLL(见 这个答案 如果你需要的细节关于出口从DLL)。

这个方案为我工作,因为它保持的实例(compiler产生的功能)的 std::vector<std::string> 类使用的立白完全分离的实例 std::vector<std::string> 在我的应用程序。

作为旁白,我怀疑原因的崩溃,你看到了(你的评论是在destructor的 std::vector<double>)是因为实例的 std::vector<double> 在你的程序是不同的,在LIB_X.

其他提示

在注释掉很可能只是随机的运气 - 如果你被损坏堆,你不要总是看到它的时候了,但一个STL向量将分配和左解除分配的事情,右所以这也难怪它发现错误

有些库需要您在某个特定顺序的事情。我不知道到底为什么,因为对我来说,似乎是放弃了,说你不能正确地设计出库,但它是可悲的事实。只要你不包括此lib_x任何地方,你有VTK它应该是正常,虽然。

然而,他们可能会争夺一些资源或使用不正确的东西,使他们无法一起工作。如果你能得到编译通过分离他们的工作确定,但它仍然失败,那么是的,你只是运气不佳,因为它只是在路上不及格,这lib_x设计并因为它是如此晦涩它不是可能已经对所有使用完全排除。如果有什么地方没有被广泛使用它通常最终被一些开发者的机器和项目上工作,但不一定是别人的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top