Как собираться повысить усиление, используя конвенцию __CDECL?
-
01-10-2019 - |
Вопрос
У меня есть проект скомпилирован с использованием __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 Конфигурация и связанные документы). Что касается ваших других вопросов:
- BOOST использует NSVC Convence Converting MSVC, кроме случаев, когда он переоценивает его на уровне кода. Я не знаю, где это те, как они относятся к библиотеке. Таким образом, вам придется искать код для «__ *» Code Decorators.
- См. Выше для частичного ответа.
- Обнаружение; Существует две причины: существует ограничение на то, сколько разных вариантов мы можем разумно обнаруживать для строительства, поскольку это экспоненциальный рост различных возможных вариаций, поэтому мы ограничиваем его наиболее важными случаями. И в случае призвания Конвенции оно на самом деле невозможно, поскольку это то, что может быть изменено на основе за функцию.