我有一个与 Abaqus 交互的后处理程序。该程序适用于 Abaqus 6.9 EF1。我想更新程序以使用 Abaqus 6.12。我没有运气让程序与更新的 API 一起工作。
我已经更新了要在 Visual Studio 2010 中链接的库列表。一切都正确构建和链接。当我运行该程序时,在点击 main
之前收到以下消息:
由于程序很大(>120k 行),我决定回归基础。在我调用 delete
之前,下面的简单程序运行良好。调用 delete
后,我收到相同的错误消息。如果我不链接到 Abaqus 库,程序将完全运行。
#include <iostream>
int main( int argc, char* argv[] )
{
std::cout << "Hello world" << std::endl;
int *p;
p = new int(3);
std::cout << *p << std::endl;
delete p;
return 0;
}
澄清:
案例 1:未链接到 Abaqus 库。运行良好。
案例 2:链接到 Abaqus 库。抛出调试断言失败消息。
底线:我不明白链接但不使用他们的库如何破坏简单的程序。
在我之前的 Abaqus 问题中,我确信他们已经创建了自己的 new
和 delete
运算符。在调用标准版本的 delete
时,是否可以调用他们的 new
版本?如果是这样,这是解决这些功能范围的方法吗?
最佳答案
原来Abaqus在全局命名空间中定义了自己的operator new
和operator delete
。因此,我在不知不觉中链接到他们的 operator new
实现。
但是,Visual Studio 链接到 operator new
的 Abaqus 定义,不链接到 operator delete
的 Abaqus 定义。相反,Visual Studio 链接到 operator delete
的标准定义。
这些函数不能互换使用,所以我收到错误消息。但是,因为 Abaqus 将它们的 operator new
和 operator delete
函数放在全局命名空间中,所以我相信我无法控制链接哪个函数。
更新:以上仅部分正确。 Abaqus 确实定义了它们自己的 operator new
,但它们没有定义匹配的 operator delete
-- 至少在全局命名空间中是这样。
因此,Visual Studio 无法链接到相应的 Abaqus operator delete
,因为它不存在。
关于c++ - 链接未引用的库会破坏我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17240361/