我正在尝试在内核模式下使用带有 VxWorks 6.6 的 boost-only Property Tree 库,并且std::runtime_error::~runtime_error
在加载 DKM 时得到一个未定义的符号。有任何想法吗?如果我std::runtime_error
直接使用,我没有问题,但使用 Boost 我似乎收效甚微。
我真的很想使用 Boost,但似乎我遇到了很多问题。
请记住,当您使用 DKM 时,您只是在翻译单元上进行部分链接。这就是为什么您的 DKM 中有未解析的符号的原因。
例如,如果您使用 printf,当 DKM 部分链接时,它不知道 printf 函数的地址是什么,因为它可能会在不同的 vxWorks 映像之间发生变化。
当您加载 DKM 时,vxworks 动态加载程序将查看 DKM 并找到 DKM 中所有未解析的符号,并将它们与内核中的符号进行匹配。
我怀疑您遇到的是您的代码可能是基于模板的,直到加载时间才被实例化,并且模板的一部分引用了 runtime_error 类。
但是,由于您的代码没有显式实例化或使用 runtime_error 类,因此它对加载程序显示为未解析的符号。在动态加载情况下,模板可能难以处理。
链接器认为:“没问题,动态加载器会解决这个问题”。不幸的是,加载程序看到这个未解析的符号并大声说“嘿...我对 runtime_error 一无所知”。
这就是文档声明(释义)的原因:“对于 C++,您的 DKM 必须是自包含的(如实现所需和使用的所有类)并且不依赖于其他 DKM”。
有两种可用的解决方案:
a) 像您所做的那样,并明确使用缺少的组件。
b) 在您的基础 vxWorks 映像中静态链接 DKM(使其不再是动态的或可下载的)
如果您要使用 RTP(而不是 DKM),则不会遇到这个特殊问题,因为 RTP 是完全链接的,而不是部分链接的。