【问题标题】:Linking unreferenced libraries breaks my program链接未引用的库会破坏我的程序
【发布时间】:2013-06-21 16:46:35
【问题描述】:

我有一个与 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 库。抛出 Debug Assertion Failed 消息。

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

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

【问题讨论】:

  • 试试 ::new::delete 看看它能做什么。
  • dbgdel.cpp 中的错误肯定表明问题出现在operator delete 中,并且路径似乎指向 Microsoft 版本。尝试使用调试器进入new 并查看它的去向。
  • @Mahesh 谢谢你的建议。我使用::new::delete 得到了相同的结果。如果全局命名空间中有两个新函数,我有什么选择吗?我将在 API 中进行挖掘,看看是否真的存在由 Abaqus 定义的 new 函数。
  • @PeteBecker 我尝试进入new 函数,但Visual Studio 跳过了它。
  • 我害怕那个。我使用 Microsoft 工具已经有好几年了,但是有一个工具,您可以在可执行文件上运行它来查看它链接到的外部符号(可能是 objdump,但我不是完全有信心)。找到 operator newoperator delete 并查看它们来自哪个 DLL。如果它们位于两个不同的 DLL 中,则可能是问题的根源。

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


【解决方案1】:

事实证明,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,因为它不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 2015-04-24
    • 1970-01-01
    • 2015-08-26
    • 2013-12-02
    • 2014-10-10
    • 2015-12-02
    • 2011-05-06
    相关资源
    最近更新 更多