¿Cómo compilo impulso usando __cdecl convención de llamada?
-
01-10-2019 - |
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
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).
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:
- 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.
- Consulte más arriba para la respuesta parcial.
- 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.