Pregunta

Tengo un proyecto compilado usando __cdecl convención de llamada (msvc2010) y compilé impulso usando el mismo compilador utilizando la configuración predeterminada.

El proyecto vinculado con el impulso pero en tiempo de ejecución que tiene un mensaje de aserción de esta manera: Archivo: ... \ impulso \ impulso \ \ program_options detalle \ parsers.hpp Línea: 79

Run-Time Check Fracaso # 0 - El valor de ESP no fue guardado correctamente a través de una llamada de función. Este es generalmente el resultado de llamar a una función declarada con una convención de llamada con un puntero de función declarada con una convención de llamada diferente.

Existen las siguientes preguntas:

  • ¿Qué convención de llamada hace impulso de la estructura con forma predeterminada en Windows (msvc2010)
  • cómo me impulso de compilación con la convención de llamada __cdecl
  • ¿por impulso no fue capaz de prevenir la vinculación con código con diferentes convenciones de llamada? Entendí que tiene el código de impulso de auto-inclusión biblioteca muy inteligente.

Actualización # 1

Parece que hace impulso de compilación y enlace con la convención de llamada apropiada, aun en tiempo de ejecución consigo el problema anterior. Hice una aplicación de ejemplo utilizando el mismo código y funciona, pero en mi solicitud de que falle. La única diferencia podría ser de configuración del proyecto o incluye / stdafx.h

¿Fue útil?

Solución 3

He encontrado la causa del problema dentro de uno de los archivos de propiedades compartidas: <StructMemberAlignment>4Bytes</StructMemberAlignment>

Si lo quito el código funcionará. Sin embargo, yo no estoy seguro de por qué ocurre esto soy y cómo podría resolverlo sin necesidad de retirar el código anterior (que fue requerido por otra biblioteca).

He añadido otra pregunta con respecto a la alineación .

Otros consejos

Sólo el uso

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

, mientras que la construcción de bibliotecas Boost.

Por lo que yo sé que no es manera de hacer uso en C ++ cdecl convenciones de llamada (consulte MSDN Convención de Llamada ). El C ++ llamado método es simplemente diferente de C. La única oportunidad que usted tiene que utilizar una de las convenciones de llamada C es para las funciones, que incluyen funciones estáticas de clase en C ++. Si sabe que es el caso puede intentar forzar la opción cuando se construye añadiendo la opción durante la construcción:

bjam CXXFLAGS = / Gd ...

(véase BBv2 Integrados cuenta )

O para que sea "permanente" configurar un usuario-config.jam con su compilador y agregarlo a las opciones de creación para todos BBv2 msvc construye (ver Configuración bBv2 y documentos relacionados). En cuanto a otros preguntas:

  1. Boost utiliza el valor predeterminado convención de llamada usos MSVC, a excepción de los casos en que lo redefine a nivel de código. No sé donde esas son como son biblioteca específica. Por lo que tendría que buscar el código de los "__ *" decoradores de código.
  2. Consulte más arriba para la respuesta parcial.
  3. Detección; hay dos razones: Hay un límite a la cantidad de opciones diferentes podemos detectar razonable para para la construcción, ya que es un crecimiento exponencial de diferentes variaciones posibles por lo que limitar a los casos más importantes. Y en el caso de la convención de llamada, en realidad no es posible, ya que es algo que se puede cambiar en función de cada función.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top