カーネル モードの VxWorks 6.6 でブースト ヘッダーのみのプロパティ ツリー ライブラリを使用しようとしていますがstd::runtime_error::~runtime_error
、DKM をロードするときに未定義のシンボルが表示されます。何か案は?直接使用する場合std::runtime_error
は問題ありませんが、Boost ではほとんど成功していないようです。
Boost を使用したいのですが、多くの問題が発生しているようです。
DKM を使用する場合、翻訳単位の部分的なリンクのみを行うことに注意してください。これが、DKM に未解決のシンボルを含めることができる理由です。
たとえば、printf を使用する場合、DKM が部分的にリンクされている場合、異なる vxWorks イメージ間で異なる可能性があるため、printf 関数のアドレスが何であるかがわかりません。
DKM をロードすると、vxworks ダイナミック ローダーが DKM を調べて、DKM 内のすべての未解決のシンボルを見つけ、それらをカーネル内のシンボルと照合します。
あなたが実行しているのは、コードがおそらくテンプレートベースであり、ロード時までインスタンス化されず、テンプレートの一部に runtime_error クラスへの参照があると思われます。
ただし、コードは runtime_error クラスを明示的にインスタンス化または使用しないため、ローダーには未解決のシンボルとして表示されます。テンプレートは、動的な読み込み状況では扱いにくいものになる可能性があります。
リンカーは、「問題ありません。動的ローダーが処理します」と考えます。残念なことに、ローダーはこの未解決のシンボルを見て、「ねえ... runtime_error について何も知らない」と大声で言います。
これが、ドキュメントに (言い換え) と記載されている理由です。
2 つの解決策が利用可能です
。
b) ベース vxWorks イメージで DKM を静的にリンクします (これにより、動的またはダウンロード可能ではなくなります)。
(DKM の代わりに) RTP を使用する場合、RTP は部分的にリンクされているのではなく、完全にリンクされているため、この特定の問題は発生しません。