“Le mélange d'une dll de bibliothèque boost statique runtime est une très mauvaise idée...”

J'ai deux projets dans une solution Visual Studio. On construit une LIB statique, l'autre crée une dynamique DLL. Les deux utilisent statique d'exécution de liens (/MT et /MTd), et à la fois utiliser Boost. Boost n'était pas ma décision, j'ai eu envie de chuck, mais j'ai été rejetée par le comité.

La LIB construit très bien, mais la DLL de la toux d'une erreur de auto_link.php (ligne 354): "le Mélange d'une dll de bibliothèque boost statique runtime est une très mauvaise idée...".

#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
#  define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
#  error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
#  define BOOST_LIB_PREFIX "lib"
#endif

Je n'ai pas de définir BOOST_DYN_LINK. Il semble Boost est faire un bond que depuis que je suis à la construction d'une DLL (_USRDLL et _WINDLL sont définis), je dois souhaitez dynamique d'exécution de liens (/MD ou /MDd, qui définit DLL) ou de liaison des DLL contre coup de pouce. C'est incorrect car j'ai expressément demandé à la liaison statique (/MT ou /MTd).

J'ai déposé une rapport de bug contre coup de pouce pour ses hypothèses incorrectes, mais qui ne m'aide pas avec l'aide de la bibliothèque. Dans le rapport, le coup de pouce responsables insistent que je suis en train d'elle (malgré le fait qu'une vérification a montré que je ne suis pas; et Stimuler la manipule dans au moins 30 dossiers). J'ai trouvé une réponse sur la relance de la liste de diffusion, qui, essentiellement les états à modifier mes paramètres de projet pour accueillir Boost.

Évolution des Dynamiques d'Exécution de liens (/MD et /MDd) n'est pas possible car la liaison statique a été choisie (1) en raison de considérations de sécurité, et (2) une autre bibliothèque utilise la liaison statique. Ce n'est pas négociable et nous n'avons pas le choix.

Pour résumer, pour plus de clarté (TLDR): je veux utiliser la liaison statique pour tout, alors que ma sortie du programme est une DLL (pas une LIB statique, pas un EXE). Tout est lié statiquement dans la DLL.

Personne ne sait comment utiliser cette bibliothèque sur Windows pour créer une DLL avec la liaison statique?

  • Pouvez-vous retirer la délinquance vérifier à partir de auto_link.hpp? Ou #undef _USRDLL et _WINDLL avant auto_link.php est inclus, et redéfinir par la suite?
  • J'ai juste abordé ce une couple de semaines, mais je ne me souviens pas des détails sur le dessus de ma tête. Nous avons une DLL qui est construit contre CRT statique et statique de pouce et il n'y a pas d'erreurs/avertissements. Je vais vérifier demain si personne ne répond alors.
  • Il convient de noter qu'il est extrêmement dangereux pour créer une DLL qui statiquement des liens vers la bibliothèque runtime C. Ce que cela signifie, c'est que la mémoire allouée dans une DLL ne peut pas être directement libérés dans l'autre. Cela peut sembler il ne se produira pas, mais elle le peut. Et vous obtiendrez des plantages aléatoires à partir d'elle.
  • Cela ne s'applique pas seulement à la statique de la CRT. Vous avez le même problème, si vous utilisez Dll qui ont été liés avec les différentes versions de la dynamique de la CRT.
  • L'un des paramètres de votre projet doit être à l'arrêt. Nous avons une DLL qui est construit contre CRT statique et statique de pouce et de ne pas avoir ce problème. Nous n'avons pas de spécial #define déclarations ou quoi que ce soit. Le projet est une DLL avec _USRDLL (PAS de DLL) a défini l'exécution et de la valeur /MT.
  • Je sais que cette configuration (une DLL d'un projet liant avec statique boost + CRT statique) est possible car je l'utilise moi-même. Je suggère la création d'un nouveau minimaliste projet DLL à partir de zéro et obtenir le coup de pouce des trucs de travail. Comparez ce fichier de projet à votre problématique et de voir quelles sont les différences.
  • Il pourrait être utile pour localiser le point où BOOST_DYN_LINK est en cours de définition. Est cette erreur qui se produit lors de la compilation d'un ou de plusieurs de la poussée de la source des fichiers, ou lors de la compilation d'un de vos fichiers source via un #include?
  • Vous pouvez essayer de définir DLL via les paramètres du projet, dans le Préprocesseur C/C++. Le Windows les en-têtes ne semblent pas prêter attention à cette définition, il pourrait ne pas avoir toutes les fâcheux effets secondaires.
  • le problème semble être que BOOST_DYN_LINK est défini quelque part. Je pense que vous devriez trouver où elle est définie, car je ne pense pas qu'il devrait être. Si j'essaie de construire l'exemple minimal donné dans votre rapport de bogue (regex) avec /Dmt et la construire une .dll il semble fonctionne très bien (comme le coup de pouce gars a dit). Avez-vous essayé de construire l'exemple minimal?
  • "le problème semble être que BOOST_DYN_LINK est défini quelque part" - merci n1ckp. J'ai essayé de dire que les gens de chez coup de pouce que trop. Ils ont insisté pour que je l'a défini.
  • Je sais que c'est un quelques années de retard - mais cela peut être utile si vous pouvez mettre à jour la question posée (en particulier étant donné la mauvaise réponse, ci-dessous), Il est auto-défini par boost-python, indépendamment des autres paramètres de l'utilisateur - à moins que l'utilisateur définit "BOOST_PYTHON_STATIC_LIB" C'est toujours un problème avec boost dans la version 1.58
  • Peut-être liés: programmers.stackexchange.com/questions/262195/...

InformationsquelleAutor jww | 2012-03-02