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

标签 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 库。抛出调试断言失败消息。

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

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

最佳答案

原来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,因为它不存在。

关于c++ - 链接未引用的库会破坏我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17240361/

相关文章:

c++ - QObject 重入和线程安全

visual-studio-2010 - Visual Studio 2010 : Unable to copy file on debugging

c# - 要获得哪个VS 2010版本?

c - Mac OS 可执行文件的 DATA 段中有什么?

c++ - 如何使用 ATL 创建 VB6 集合对象

c++ - 如何正确地从istream、ostream继承我的类?

c++ - 浏览器中的多线程 WebAssembly 比单线程慢,为什么?

visual-studio-2010 - 选择 "Debug | Start new instance"时进行多次重建

c++ - C++ 链接是否足够聪明,可以避免链接未使用的库?

c - 为什么链接器不抛出多个函数声明错误?