链接未引用的库会破坏我的程序

时间:2013-06-21 16:46:36

标签: c++ visual-studio-2010 linker

我有一个与Abaqus接口的后处理程序。该程序适用于Abaqus 6.9 EF1。我想更新程序以使用Abaqus 6.12。我没有运气让程序使用更新的API。

我已更新了要在Visual Studio 2010中链接的库列表。所有内容都正确构建和链接。当我运行该程序时,在收到main

之前,我收到以下消息

Error message

由于程序很大(> 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库。抛出Debug Assertion Failed消息。

底线:我不明白如何链接,但不使用他们的库打破了简单的程序。

在我以前的Abaqus问题中,我确信自己已经创建了自己的newdelete运算符。在调用new的标准版本时,是否可以调用他们的delete版本?如果是这样,它们是解决这些功能范围的一种方法吗?

1 个答案:

答案 0 :(得分:0)

事实证明,Abaqus在全局命名空间中定义了自己的operator newoperator delete。因此,我在不知不觉中链接到operator new的实现。

但是,Visual Studio将operator new而不是的Abaqus定义链接到operator delete的Abaqus定义。相反,Visual Studio链接到operator delete的标准定义。

这些函数不能互换使用,因此我收到错误消息。但是,由于Abaqus将operator newoperator delete函数放在全局命名空间中,我相信我无法控制哪个函数被链接。


更新:以上只是部分正确。 Abaqus确实定义了他们自己的operator new,但他们定义匹配的operator delete - 至少在全局命名空间中。

因此,Visual Studio无法链接到相应的Abaqus operator delete,因为它不存在。