Как мне скомпилировать boost, используя соглашение о вызовах __cdecl? - PullRequest
0 голосов
/ 24 апреля 2010

У меня есть проект, скомпилированный с использованием __cdecl соглашения о вызовах (msvc2010), и я скомпилировал boost, используя тот же компилятор, используя настройки по умолчанию.

Проект связан с boost, но я во время выполнения получил сообщение assert: Файл: ... \ boost \ boost \ program_options \ detail \ parsers.hpp Линия: 79

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

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

  • какое соглашение о вызовах ускоряет сборку по умолчанию в Windows (msvc2010)
  • как скомпилировать boost с соглашением о вызовах __cdecl
  • почему boost не смог предотвратить соединение с кодом с другими соглашениями о вызовах? Я понял, что в boost есть действительно умный код автоматического включения библиотеки.

Обновление # 1

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

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Просто используйте

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

при создании библиотек наддува.

1 голос
/ 24 апреля 2010

Насколько я знаю, нет способа заставить C ++ использовать соглашения о вызовах cdecl (см. Соглашение о вызовах MSDN ). Вызов метода C ++ отличается от вызова C. Единственная возможность использовать одно из соглашений о вызовах C - это функции, которые включают статические функции класса в C ++. Если вы знаете, что это так, вы можете попытаться принудительно включить опцию при сборке, добавив опцию во время сборки:

bjam cxxflags = / Gd ...

(см. Встроенные функции BBv2 )

Или чтобы сделать его "постоянным", настройте user-config.jam с вашим компилятором и добавьте его в параметры сборки для всех сборок BBv2 msvc (см. Конфигурация BBv2 и соответствующие документы). Что касается вас, другие вопросы:

  1. Boost использует соглашение о вызовах по умолчанию, которое использует MSVC, за исключением случаев, когда он переопределяет его на уровне кода. Я не знаю, где они, так как они специфичны для конкретной библиотеки. Поэтому вам придется искать код для «__ *» кодовых декораторов.
  2. См. Частичный ответ выше.
  3. Обнаружение; Есть две причины: существует ограничение на количество различных вариантов, которые мы можем разумно определить для строительства, поскольку это экспоненциальный рост различных возможных вариантов, поэтому мы ограничиваем его наиболее важными случаями. А в случае соглашения о вызовах это на самом деле невозможно, поскольку это то, что можно изменить для каждой функции.
0 голосов
/ 25 апреля 2010

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

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

Я добавил еще один вопрос, касающийся усиления и выравнивания элементов структуры .

...