2010-04-24 15 views
0

J'ai un projet compilé en utilisant la convention d'appel __cdecl (msvc2010) et j'ai compilé boost en utilisant le même compilateur en utilisant les paramètres par défaut.Comment compiler boost en utilisant la convention d'appel __cdecl?

Le projet lié à coup de fouet, mais je lors de l'exécution, je suis un message assert comme ceci: fichier: ... \ boost \ boost \ program_options \ détail \ parsers.hpp Ligne: 79

Run-Time Check Failure # 0 - La valeur de ESP n'a pas été enregistrée correctement lors d'un appel de fonction. Ceci est généralement le résultat de l'appel d'une fonction déclarée avec une convention d'appel avec un pointeur de fonction déclaré avec une convention d'appel différente.

Il y a les questions suivantes:

  • ce que la convention d'appel ne dope construit avec par défaut sur Windows (msvc2010)
  • comment je compile coup de pouce avec la convention d'appel __cdecl
  • pourquoi boost n'a pas été capable d'empêcher la liaison avec le code avec différentes conventions d'appel? J'ai compris que boost a un code d'auto-inclusion de bibliothèque vraiment intelligent.

Mise à jour # 1

Il semble que boost ne compile et lien avec la convention d'appel proprement dit, toujours à l'exécution je reçois le problème ci-dessus. J'ai fait un exemple d'application en utilisant le même code et cela fonctionne mais dans mon application il échoue. La seule différence peut provenir de la configuration du projet ou inclut/stdafx.h

Répondre

0

J'ai trouvé la cause du problème dans l'un des fichiers de propriétés partagées: <StructMemberAlignment>4Bytes</StructMemberAlignment>

Si je le supprimer le code fonctionnera.Pourtant, je ne suis pas sûr pourquoi cela se produit et comment pourrais-je le résoudre sans enlever le code ci-dessus (qui était requis par une autre bibliothèque).

J'ai ajouté une autre question concernant boost and structure member alignment.

1

Autant que je sache, il n'est pas possible d'utiliser C++ en utilisant les conventions d'appel cdecl (voir MSDN Calling Convention). L'appel de méthode C++ est juste différent de C. La seule opportunité que vous avez d'utiliser l'une des conventions d'appel C est pour les fonctions, qui incluent des fonctions statiques de classe en C++. Si vous savez c'est le cas, vous pouvez essayer de forcer l'option lors de la construction en ajoutant l'option lors de la construction:

bjam CXXFLAGS =/Gd ...

(voir BBv2 Builtin features)

Ou pour le rendre "permanent" configure un user-config.jam avec votre compilateur et l'ajoute aux options de compilation pour toutes les versions de msvc BBv2 (voir BBv2 Configuration et docs associés). Pour vous autres questions:

  1. Boost utilise la convention d'appel par défaut utilisée par MSVC, sauf dans les cas où il la remplace au niveau du code. Je ne sais pas où ils sont car ils sont spécifiques à la bibliothèque. Vous devrez donc rechercher le code pour les décorateurs de code "__ *".
  2. Voir ci-dessus pour une réponse partielle.
  3. Détection; Il y a deux raisons à cela: Il y a une limite au nombre d'options différentes que nous pouvons raisonnablement détecter pour la construction car c'est une croissance exponentielle de différentes variations possibles, donc nous la limitons aux cas les plus importants. Et dans le cas d'une convention d'appel, ce n'est pas vraiment possible puisque c'est quelque chose qui peut être changé sur une base par fonction.
1

Il suffit d'utiliser

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

tout en construisant des bibliothèques Boost.