Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SEGFULT,因为缺少头文件_C++_Linux_G++_Shared Libraries - Fatal编程技术网

C++ SEGFULT,因为缺少头文件

C++ SEGFULT,因为缺少头文件,c++,linux,g++,shared-libraries,C++,Linux,G++,Shared Libraries,在构建共享对象时,我忘记将第三方“仅标头”库标头(.h)文件放入正确的路径。它建得很好,令人惊讶 运行时,segfault正好发生在我的共享对象中使用第三方库时的行上 我不明白的是,当我将这些头文件复制到用#include指定的路径时,我无法导致segfault。我甚至没有重新构建对象。非常奇怪的是,当我把头文件放在dir中时,它仍然工作——没有segfault。然而,当我完全rm dir时,它崩溃了。它是否查找当前目录和子目录的头文件?我还在标准(?)/usr/local/include 我以

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

运行时,segfault正好发生在我的共享对象中使用第三方库时的行上

我不明白的是,当我将这些头文件复制到用
#include
指定的路径时,我无法导致segfault。我甚至没有重新构建对象。非常奇怪的是,当我把头文件放在dir中时,它仍然工作——没有segfault。然而,当我完全rm dir时,它崩溃了。它是否查找当前目录和子目录的头文件?我还在标准(?)
/usr/local/include

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

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

编辑

代码:

#包括
#包括
#包括
void MyClass::myFunction()
{
rapidjson::StringBuffer字符串;
rapidjson::Writer jsonWriter(字符串);
}
以下是调试会话的链接:

运行程序时,不需要向用户提供头文件

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

对奇怪的移动/删除行为的解释可能是,在移动过程中共享对象仍然加载到内存中,并保留了include dir中某个对象的打开文件句柄


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

这可能是因为当您没有包含标头时,自动生成的函数原型可能与实际函数不匹配,因此编译器会执行一些愚蠢的操作,从而导致segfault。此外,您已经成为会员这么久了,您应该知道我们需要查看一些代码才能真正帮助您。您测试了多少次这种相关性?它可能只是程序中未定义的行为,在随机时间显示为segfault。没有编译器警告。我已经测试了3次,以确保我看到了什么。你能指出这方面的文档吗?此外,您关于移动“不会伤害”的评论只有在移动位于同一文件系统中时才是正确的…对不起,我手头没有文档,需要自己搜索。您是对的,这仅在单个文件系统中是正确的。
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/stringbuffer.h>

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