4

難しい方法ですが、少なくともboost::program_optionsコンパイラで構成された構造体メンバーの配置に依存していることがわかりました。

デフォルト設定を使用してブーストをビルドし、4 バイト アラインメント ( /Zp4) を使用してプロジェクトにリンクすると、実行時に失敗します (program_options で最小限のテストを行いました)。Boost は不適切な呼び出し規約の可能性を示すアサートを生成しますが、本当の理由は構造体メンバーの配置です。

これを防ぐ方法はありますか?アラインメントによってコードに互換性がなくなる場合、これをライブラリの命名に含めるべきではありませんか?

4

1 に答える 1

8

プログラムとリンク先のライブラリが同じABIを持っていることを確認する必要があります。

C ++クラスおよび関数のABIを変更できるコンパイラスイッチの数が多すぎる可能性があるため、3000を超える組み合わせに名前を付けることは明らかに問題です。

より詳細な理論的根拠については、こちらをご覧ください。

于 2010-04-26T07:54:59.877 に答える