2010-04-26 3 views
4

J'ai trouvé, le hard way, qu'au moins boost::program_options dépend de l'alignement des membres de la structure configurée par le compilateur.La bibliothèque de boost doit-elle dépendre des alignements des membres de la structure?

Si vous construisez boost en utilisant les paramètres par défaut et que vous le liez avec un projet en utilisant l'alignement de 4 octets (/Zp4), il échouera à l'exécution (fait un test minimal avec program_options). Boost va générer une assertion indiquant une éventuelle mauvaise convention d'appel mais la vraie raison est l'alignement des membres de la structure.

Est-il possible d'empêcher cela? Si l'alignement rend le code incompatible, cela ne devrait-il pas être inclus dans la dénomination de la bibliothèque?

+0

Vous savez, il y a * beaucoup * d'options de compilateur qui modifient l'ABI. Ils ne peuvent pas tous être nommés. Parfois, même les développeurs Boost doivent supposer que leurs utilisateurs sont compétents et savent comment lier à une bibliothèque – jalf

+1

Compilez-vous les options du programme lib vous-même? Ou en utilisant un préconstruit? Si vous pouvez fournir le cas de test, nous aimerions, par exemple Vladimir P., le déboguer. Parce que tant que * tout * le code est compilé avec des options compatibles, les choses ne devraient pas casser. – GrafikRobot

Répondre

8

Vous devez vous assurer que votre programme et les bibliothèques que vous liez ont le même ABI.

Le nombre de commutateurs de compilation qui peuvent modifier l'ABI des classes et des fonctions C++ peut être trop important. Il est donc clairement problématique de nommer plus de 3000 combinaisons.

Vous pouvez jeter un oeil à here pour une raison plus détaillée.

Questions connexes