2010-04-24 21 views
0

我有一個使用__cdecl調用約定(msvc2010)編譯的項目,我使用相同的編譯器使用默認設置編譯boost。如何使用__cdecl調用約定編譯boost?

該項目與升壓聯繫,但我在運行時我得到了這樣的斷言消息: 文件:... \提升\提升\ program_options \詳細\ parsers.hpp 行:79

運行時檢查失敗#0 - 在函數調用中未正確保存ESP的值。這通常是調用一個調用約定的函數聲明的結果,其中函數指針聲明的調用約定不同。

有以下幾個問題:

  • 什麼調用約定並在默認情況下在Windows(msvc2010)推動建立與
  • 怎麼我編譯加強與__cdecl調用約定
  • 爲什麼升壓不能夠防止與不同調用約定的代碼鏈接?我明白,boost有真正的智能庫自動包含代碼。

更新#1

它看起來是升壓並在運行時編譯和正確調用約定的鏈接,我還是得到了上述問題。我做了一個示例應用程序使用相同的代碼,它的工作原理,但在我的應用程序失敗。唯一的區別可能是從項目配置或包括/ stdafx.h

回答

0

我發現這個問題的原因裏面的共享屬性文件之一:<StructMemberAlignment>4Bytes</StructMemberAlignment>

如果我刪除它的代碼將工作。不過,我不確定爲什麼會發生這種情況,如何解決這個問題而不刪除上面的代碼(這是另一個庫所要求的)。

我又增加了一個關於boost and structure member alignment的問題。

1

據我所知,沒有辦法讓C++使用cdecl調用約定(請參閱MSDN Calling Convention)。 C++方法調用與C不同。您必須使用C調用約定之一的唯一機會是函數,其中包括C++中的類靜態函數。如果你知道這是你可以嘗試在生成過程中添加選項進行構建時迫使該選項的情況下:

的bjam CXXFLAGS = /釓...

(見BBv2 Builtin features

或者使它「永久」用你的編譯器設置一個user-config.jam,並將它添加到所有BBv2 msvc版本的構建選項中(參見BBv2 Configuration和相關文檔)。至於你的其他問題:

  1. 升壓使用默認調用約定MSVC使用,除了它覆蓋了它在代碼層的情況。我不知道它們在哪裏,因爲它們是特定於圖書館的。所以你必須搜索「__」代碼裝飾器的代碼。
  2. 請參閱上面的部分答案。
  3. 檢測;有兩個原因:我們可以合理檢測建築物的多少種不同選項的限制,因爲它是不同可能變化的指數增長,所以我們將其限制爲最重要的情況。而在調用約定的情況下,它實際上並不可行,因爲它可以根據每個函數進行更改。
1

只需使用

bjam ... **cxxflags=/Zp4** 

同時建設Boost庫。