6
votes

Liaison contre la bibliothèque dans la libération et .exe dans les accidents de débogage dans Visual Studio

J'utilise Visual C ++ 2008 SP1. J'ai une application qui est compilée en mode débogage, mais des liens contre une bibliothèque en mode de sortie.

Je reçois un crash au démarrage de l'application. Pour rendre le problème plus petit, j'ai créé une solution simple avec 2 projets: p>

  • lib_release (génère un .lib, en mode de sortie) li>
  • exécutant_utilisateur_lib_release (générique un .exe, en mode débogage) li> ul>

    Le projet 'lib_release' est assez simple pour avoir une classe simple: p> xxx pré>

    le projet "exécutant_utilisateur_lib_release" est simple comme ceci: p>

    //main.cpp
    #include "Foo.h"
    int main() {
       Foo foo;
       foo.doSomething();
       return 0;
    }
    


4 commentaires

Est-ce le code exemplaire exact (FOO.H) ou est-ce simplement simplifié et non ce que vous avez vraiment essayé?


@Timbo C'est presque la même chose, juste la classe FOO a une version .CPP de celui-ci qui a la méthode DOSOM () mise en œuvre.


Êtes-vous le fournisseur de la LIB statique, ou est-ce une tierce partie?


@Kjawold je suis le fournisseur de la lib


4 Réponses :


2
votes

Le problème ici est que le débogage utilisera la version de débogage de l'exécution C et la version utilisera la version de version de l'exécution C et lorsque vous essayez d'accéder à la mémoire dans la limite DLL, ce sera dans la mauvaise heure d'exécution. et crash. Ses toutes manières préférentis d'utiliser uniquement des créations de débogage ensemble (ou de libération)


1 commentaires

Où voyez-vous une allocation dynamique?



8
votes

Vous ne avez pas pour utiliser les mêmes commutations pour la libération et les modules de débogage (mais cela aide), à ​​condition que vous suivez des règles très spécifiques: ne mélangez jamais et, correspond à l'accès à la mémoire allouée à l'aide de chaque heure d'exécution.

Pour mettre cela plus simplement, si vous avez une routine dans une DLL qui alloue une certaine mémoire et le renvoie à l'appelant, l'appelant ne doit jamais libérer - vous devez créer une fonction dans la DLL d'origine qui libère la mémoire. De cette façon, vous êtes en sécurité des intercadénages d'exécution.

Si vous considérez que les DLL Windows sont construites uniquement (sauf si vous avez la version de débogage de Windows), vous les utilisez à partir de vos applications de débogage, vous verrez comment cela importe.

Votre problème est maintenant que vous utilisez une bibliothèque statique, il n'y a plus de limite DLL, et les appels dans la libièvre sont compilés à l'aide de la version statique de l'exécution C. Si votre EXE utilise la version dll dynamique de l'exécution, vous constaterez que la liaison utilise celui-ci à la place de celui que votre statique a utilisé ... et vous aurez des accidents.

Donc, vous pourriez reconstruire votre libérité de diffusion de la liberme; Ou vous pouvez vous assurer qu'ils utilisent tous les deux la même bibliothèque CRT; Ou vous pouvez vous assurer qu'ils utilisent tous les deux le même type de CRT - c'est-à-dire la version DLL ou la version statique, tout en gardant les différences de débogage / libération.

Au moins, je pense que c'est votre problème - Quels sont les paramètres "Génération de code, Library d'exécution"?


4 commentaires

Oui c'est mon problème. Cependant, comment les développeurs libérations libèrent-ils que leurs libs sont compilés sous forme de «libération» pour les rendre «liés» avec un programme en mode de débogage? Suivez-vous ces «règles strictes» que vous dites?


Utilisez-vous le CRT statique ou dynamique de notre liber? Si vous voulez qu'il soit complètement portable, utilisez la version statique car tous les appels CRT seront intégrés dans la lib alors. Sinon, construisez votre exe avec le CRT de la libération. Je ne suis pas sûr qu'il y ait de nombreuses libs statiques commerciales, les gens ont tendance à fournir des dlls à la place.


Suite à ces règles spécifiques, il pourrait y avoir un problème avec différents modes de débogage?


@Triples Oui, mais uniquement si les structures sont exposées en dehors de la DLL - qui se produiront presque certainement dans la pratique. Ne changez pas les emballages laissez-les en défaut - il n'a pas de sens de changer de défaut.



5
votes

Pour la combinaison de problèmes de libération et de débogage que les personnes précédentes ont mentionné, ces problèmes ne se présenteraient pas avant que la mauvaise bibliothèque d'exécution ait tenté de désaffecter. Je pense que ce que vous rencontrez est que vs 2008 a la débogage itérateur activé par défaut, de sorte que votre LIB et votre EXE font référence à différentes implémentations de STD :: Vector. Vous voudrez ajouter _has_iterator_debugging = 0 à vos paramètres de préprocesseur. Ensuite, vous commencerez à frapper le problème de différents tas pour les différents accidents. Dans le passé, nous avons eu des règles et des politiques différentes pour éviter cela, mais nous comptons maintenant sur un environnement de construction cohérent - ne mélangez pas et ne correspond pas.


0 commentaires

0
votes

La bibliothèque ci-jointe ne doit pas partager les ressources CRT dans la limite de la bibliothèque. Pour Code C, la mémoire allouée de manière dynamique doit être traitée du même côté de la limite. pour le code C ++, vous pouvez utiliser l'espace de noms STD à l'intérieur de votre DLL, mais ces objets à l'aide de l'espace de noms STD doivent être transmis à la limite de la bibliothèque.

voir Cette répond à une question similaire


0 commentaires