使用Boost C ++库与VxWorks时出错

时间:2011-02-14 14:14:05

标签: c++ boost vxworks

我试图在内核模式下使用带有VxWorks 6.6的boost header-only属性树库,当我加载DKM时,我得到std::runtime_error::~runtime_error的未定义符号。有任何想法吗?如果我直接使用std::runtime_error,我没有任何问题,但是对于Boost,我似乎没什么成功。

我真的很想使用Boost,但似乎我遇到了很多问题。

1 个答案:

答案 0 :(得分:3)

请记住,当您使用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是完全链接的,而不是部分链接的。