“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/...
Vous devez vous connecter pour publier un commentaire.
Cette question est en effet une faute avec des boosts de paramètres.
Pour une raison inconnue (que je ne peut pas déterminer à être logique, car il n'a pas d'effet). Boost Python de la force de la liaison dynamique de boost, quel que soit l'utilisateur options
En bref, si vous avez boost-python dans votre projet, de stimuler de manière incorrecte empêche statique de la liaison de pouce avec le /MT commutateur.
Ce problème est résolu facilement par définition BOOST_PYTHON_STATIC_LIB avant, y compris le coup de pouce des en-têtes.
Version courte: écoutez les gars sur le coup de pouce ML. Boost ne prend pas en charge ce que vous essayez de faire, et c'est une mauvaise idée de toute façon. Mieux pour accepter cela et prendre les autres de la bibliothèque de l'utilisation de la dynamique de l'exécution.
Version longue:
Vous semblez être de l'incompréhension de ce Boost est vous dire. Vous êtes en train d'analyser le coup de pouce du code source au lieu de simplement lire ce qu'il dit:
Boost pense que vous êtes la construction d'une DLL, tout en les reliant de manière statique pour les bibliothèques. Ce qui est exactement ce que vous faites; Boost a détecté avec précision ce que vous essayez de faire.
Votre problème, c'est que la bibliothèque Boost n'est pas soutien d'être intégrée dans une DLL qui n'est pas dynamiquement liaison vers les bibliothèques. La raison pour cela est qu'il est "une très mauvaise idée." Afin de vérifier pour voir si vous êtes en essayant de le faire et d'arrêter votre construire avec un message d'erreur vous rappelant de ce fait.
La "freetards" au Boost qui ne savent pas comment faire quelque chose de travail "de la case" empêcher cela parce que la liaison statique à l'exécution dans une DLL est généralement une erreur de saisie par l'utilisateur. C'est soit accidentellement ou par ignorance des principaux problèmes que cela peut créer.
Si vous lier statiquement à l'exécution, chaque DLL/exe va avoir sa propre copie de l'exécution, avec leurs propres variables globales. Et depuis le tas est gérée par des variables globales, ce qui signifie que chaque DLL/exe aura son propre tas. Donc, si vous essayez de libérer la mémoire allouée dans un autre espace d'adressage... boom. Et c'est beaucoup plus facile que vous le pensez si vous ne faites pas attention.
Cela peut entraîner d'autres problèmes. Le "freetards" essaient de vous arrêter de se tirer une balle dans le pied. Mais, évidemment, vous le savez mieux que de "forcer leur merde sur les honnêtes et les utilisateurs peu méfiants" qui veulent être informés quand ils sont sur le point de conduire d'une falaise.
Maintenant, vous pouvez simplement supprimer le message d'erreur. La plupart de Boost est en-têtes, donc tant que vous n'êtes pas vraiment un lien vers une de ses .libs, vous devriez être bien. Cependant, je suppose que "auto_link.hpp" n'est utilisé que par les pièces de Boost qui sont .libs, les chances sont bonnes que le fait que vous avez rencontrées pour commencer signifie que vous êtes en essayant de lier à un coup de pouce .lib.
Si la sécurité est une considération, vous devez être conscient de ceci: le fait même que vous êtes en train de construire une DLL signifie que votre demande est potentiellement ouvert à la DLL injections, indépendamment de la façon dont vous vous reliez à l'exécution. Donc je ne vois pas comment la liaison dynamique est moins en sécurité que statique.