【发布时间】: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