【问题标题】:segfault because of missing header files由于缺少头文件而导致的段错误
【发布时间】:2012-04-12 10:01:33
【问题描述】:

在构建共享对象时,我忘记将第 3 方“仅标头”库标头 (.h) 文件放入正确的路径。它构建得很好 - 回想起来令人惊讶。

在我的共享对象中使用该第 3 方库时,恰好在该行发生了段错误。

我不明白的部分是当我将这些头文件复制到使用#include 指定的路径时,我无法导致段错误。我什至没有重新构建对象。非常奇怪的是,当我 mv 头文件所在的目录时,它仍然有效 - 没有段错误。但是,当我完全 rm 目录时,它崩溃了。它是否查找当前目录和子目录的头文件?我在标准(?)/usr/local/include

中也有那个仅包含标头的库

我以前没有使用过共享对象。我通常创建静态对象并将它们包含在构建中。我用来创建有问题的共享对象的标志是-shared -fPIC

我想了解这种行为。由于部署,这很有趣。在生产机器上部署时是否需要包含这些头文件?本质上,我不想将其作为依赖项,因为它是“仅标头”库。

编辑

代码:

#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/stringbuffer.h>

void MyClass::myFunction()
{
    rapidjson::StringBuffer string;
    rapidjson::Writer<rapidjson::StringBuffer> jsonWriter(string);
}

这是调试会话的链接: http://pastebin.com/a0FaQwf1

【问题讨论】:

  • 这可能是因为当你没有包含头文件时,自动生成的函数原型可能与实际函数不匹配,所以编译器做了一些愚蠢的事情导致了段错误。
  • 另外,您已经成为会员这么久了,您应该知道我们需要查看一些代码才能真正为您提供帮助。
  • 您测试了多少次这种相关性?它可能只是程序中未定义的行为,在随机时间表现为段错误。
  • 没有编译器警告。我已经测试了 3 次以确保我看到的是什么。

标签: c++ linux g++ shared-libraries


【解决方案1】:

为了运行程序,您永远不需要向用户提供头文件。

您的库可能只是优化了默认值, 这就是为什么它在编译时丢失时不会失败的原因

【讨论】:

    【解决方案2】:

    对奇怪的移动/删除行为的解释可能是共享对象在移动过程中仍被加载到内存中,并保留了包含目录中某些内容的打开文件句柄。

    你知道,在 ext2/3/4 下打开的文件连接到 inode 而不是 dir 路径。因此移动打开的文件不会造成伤害。另一方面,IIRC 也删除不会造成伤害。 inode 的释放将被延迟,直到所有进程都关闭了文件。也许这只是发生在你的 mv 和 rm 之间。

    【讨论】:

    • 你能指出这方面的文档吗?此外,您关于移动“不会造成伤害”的评论只有在移动位于同一文件系统内时才是正确的......
    • 对不起,我手头没有文档,需要自己搜索。没错,这仅适用于单个文件系统。
    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2020-12-06
    • 2016-07-25
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多