Как собираться повысить усиление, используя конвенцию __CDECL?

StackOverflow https://stackoverflow.com/questions/2704732

Вопрос

У меня есть проект скомпилирован с использованием __cdecl Конвенция о вызове (MSVC2010) и я скомпилировал Boost, используя тот же компилятор, используя настройки по умолчанию.

Проект, связанный с повышением, но я во время выполнения я получил сообщение Assert, подобное так: Файл: ... Boost Boost Program_options Detail Parsers.hpp Линия: 79

Проверка выполнения Проверка № 0 - значение ESP не было должным образом сохранено в результате вызова функции. Обычно это результат вызова функции, заявленной с одной конвенцией о вызове, с указателем функции, заявленным с другой конвенцией о вызове.

Есть следующие вопросы:

  • Какую конвенцию о вызове увеличивается по умолчанию на Windows (MSVC2010)
  • Как я могу собрать повышение с Конвенцией о вызове __cdecl
  • Почему Boost не смог предотвратить ссылку с кодом с разными призывами? Я понял, что Boost имеет действительно смарт-библиотеку автоматического включения кода.

Обновление № 1.

Похоже, что повышение делает компиляцию и ссылку с надлежащей конвенцией о вызове, все еще во время выполнения я получаю вышеуказанную проблему. Я провел приложение образца, используя тот же код, и он работает, но в моем приложении не удается. Единственное отличие может быть из конфигурации проекта или включает / stdafx.h

Это было полезно?

Решение 3

Я нашел причину проблемы внутри одного из файлов общих свойств: <StructMemberAlignment>4Bytes</StructMemberAlignment>

Если я удалю его, код будет работать. Тем не менее, я не уверен, почему это происходит и как я мог решить это без удаления вышеуказанного кода (что требовалось другой библиотекой).

Я добавил другой вопрос относительно Улучшение и структура выравнивания члена.

Другие советы

Просто использовать

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

Во время строительства библиотек Boost.

Насколько я знаю, есть не способ сделать C ++, используйте CDECL Consentions Conventions (см. MSDN Конвенция о вызове). Вызов метода C ++ просто отличается от C. единственной возможности, которую вы должны использовать одну из C вызывающих конвенций, предназначен для функций, которые включают в себя классовые статические функции в C ++. Если вы знаете, что это так, вы можете попробовать заставить опцию при создании, добавив опцию во время сборки:

bjam cxxflags = / gd ...

(видеть Встроенные особенности BBV2)

Или сделать его «постоянным» настроить пользователя-Config.jam с вашим компилятором и добавить его в параметры сборки для всех сборных BBV2 MSVC (см. BBV2 Конфигурация и связанные документы). Что касается ваших других вопросов:

  1. BOOST использует NSVC Convence Converting MSVC, кроме случаев, когда он переоценивает его на уровне кода. Я не знаю, где это те, как они относятся к библиотеке. Таким образом, вам придется искать код для «__ *» Code Decorators.
  2. См. Выше для частичного ответа.
  3. Обнаружение; Существует две причины: существует ограничение на то, сколько разных вариантов мы можем разумно обнаруживать для строительства, поскольку это экспоненциальный рост различных возможных вариаций, поэтому мы ограничиваем его наиболее важными случаями. И в случае призвания Конвенции оно на самом деле невозможно, поскольку это то, что может быть изменено на основе за функцию.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top