__CDECL呼び出しコンベンションを使用してBoostをコンパイルするにはどうすればよいですか?
-
01-10-2019 - |
質問
使用してコンパイルされたプロジェクトがあります __cdecl
呼び出しコンベンション(MSVC2010)と私は、デフォルト設定を使用して同じコンパイラを使用してBoostをコンパイルしました。
Boostにリンクされたプロジェクトですが、私は実行時にこのような主張メッセージを受け取りました:... boost boost program_options detail parsers.hpp line:79
ランタイムチェック障害#0- ESPの値は、関数呼び出し全体で適切に保存されませんでした。これは通常、異なる呼び出し条約で宣言された関数ポインターを使用して、1つの呼び出し条約で宣言された関数を呼び出した結果です。
次の質問があります。
- Windows(MSVC2010)でデフォルトでビルドをブーストするコールコンベンションは
- __CDECL呼び出しコンベンションでBoostをコンパイルする方法
- Boostが異なる通話規則のコードとのリンクを防ぐことができなかったのはなぜですか? Boostには本当にスマートなライブラリオートインクルージョンコードがあることを理解しました。
更新#1
Boostは、適切な呼び出しコンベンションとコンパイルしてリンクしているように見えますが、実行時に上記の問題が発生します。同じコードを使用してサンプルアプリケーションを実行しましたが、機能しますが、アプリケーションでは失敗します。唯一の違いは、プロジェクトの構成から、または/stdafx.hを含む可能性があります
解決 3
共有プロパティファイルの1つ内で問題の原因を見つけました。 <StructMemberAlignment>4Bytes</StructMemberAlignment>
削除すると、コードが機能します。それでも、なぜこれが起こっているのか、上記のコードを削除せずにどのように解決できるかはわかりません(別のライブラリで必要でした)。
私は別の質問を追加しました ブーストおよび構造メンバーアライメント.
他のヒント
使用するだけです
bjam ... **cxxflags=/Zp4**
ブーストライブラリの構築中。
私が知っている限り、C ++を使用する方法はありませんCDECL呼び出しコンベンション(参照 MSDNコールコンベンション)。 C ++メソッド呼び出しはCとはまったく異なります。C呼び出し規則のいずれかを使用する必要がある唯一の機会は、C ++のクラス静的関数を含む関数です。それがわかっている場合は、ビルド中にオプションを追加して、構築時にオプションを強制することを試みることができます。
bjam cxxflags =/gd ...
(見る BBV2ビルトイン機能)
または、コンパイラを使用してユーザーconfig.jamを「永続的」に設定し、すべてのBBV2MSVCビルドのビルドオプションに追加するために(参照 BBV2構成 関連ドキュメント)。あなたは他の質問について:
- Boostは、コードレベルでオーバーライドする場合を除き、デフォルトの呼び出しコンベンションMSVCを使用します。ライブラリ固有のものであるため、それらがどこにあるのかわかりません。したがって、「__*」コードデコレータのコードを検索する必要があります。
- 部分的な答えについては、上記を参照してください。
- 検出; 2つの理由があります。さまざまなバリエーションの指数関数的な成長であるため、構築用に合理的に検出できる異なるオプションの数に制限があるため、最も重要なケースに制限します。また、慣習を呼び出す場合は、関数ごとに変更できるものであるため、実際には不可能です。