À l'aide de Visual Studio 2010, comment peut-on lier à une DLL générée par Visual Studio 2008

Mes questions sont:

  • Est-il possible d'établir un lien de VS2008
    généré Dll à l'aide de VS2010?
  • Si non, pourquoi semble-t-il être
    possible de les associer à des bibliothèques statiques
    généré par VS2008.
  • Je vois que VS2010 dispose désormais d'une Plate-forme
    Jeu d'outils de l'option. Mais que de laisser
    les gens mis à v90 au lieu de v100
    même si ils n'ont pas de VS2008
    installé?
  • Même si j'utilise le /Z7 compilateur
    commutateur, pourquoi dois-je toujours besoin d'avoir un
    .apb pour déboguer Dll.

Les Détails

Je peux utiliser Visual Studio 2010 pour le lien vers mon Leptonica C bibliothèques statiques générés par Visual Studio 2008 sans aucun problème. (Voir la Références section ci-dessous pour plus de détails sur la manière dont je construis Leptonica et un lien vers elle.)

Cependant, lorsque j'essaie de le lien le même programme (leptonlib-1.67\prog\ioformats_reg.c) avec mon VS2008 généré DLL de la version de Leptonica le programme se bloque. Le débogage, je peux voir que le problème est que ioformats_reg.c fait ceci:

fp = fopen(filename, "rb"); /* in ioformats_reg.c */

et, peu après, dans le leptonlib.dll ce qui suit est faite, qui se bloque:

rewind(fp);                 /* in leptonlib.dll */

Comment faire un lien avec le bon runtime C (CRT) de la bibliothèque dit:

Une bibliothèque réutilisable et l'ensemble de ses
les utilisateurs doivent utiliser la même bibliothèque CRT
types et par conséquent le même compilateur
interrupteur...

Si vous choisissez de mélanger les bibliothèques CRT,
rappelez-vous que vous avez deux
des copies de la CRT, séparés et
états distincts, de sorte que vous devez être
attention à ce que vous essayez de faire
sur un CRT-frontière. Il y a beaucoup de
les moyens d'avoir des ennuis avec deux
Des tubes cathodiques. Voici quelques-uns:

  • Il y a deux tas distincts. Vous ne pouvez pas allouer (explicitement à nouveau,
    malloc, ou-ou implicitement avec
    strdup, strstreambuf::str, ou ainsi de suite),
    et puis passer le pointeur sur une
    CRT-limite d'être libéré.
  • Vous ne pouvez pas passer d'un FICHIER* ou descripteur de fichier sur un CRT-frontière et
    attends le "stdio faible niveau d'e /s" à
    travail.
  • Vous ne pouvez pas définir les paramètres régionaux dans l'un et espérer que les autres locale de l'être ensemble.

À partir de Visual C++ 4.0, le
l'éditeur de liens émet un avertissement (LNK4098)
si, partant, d'un module de tentatives de
combiner plus d'une copie de la CRT
de la bibliothèque. Pour plus d'informations, recherche
le fichier d'Aide pour LNK4098.

Mais je ne pas obtenir tout LNK4098 messages d'erreur de l'VS2010 de l'éditeur de liens.

Leptonica utilise fopen(), rewind(), fclose(), etc. dont la documentation catégorise Flux I/O pas de "bas niveau d'e /s", mais ceux-ci passent autour de FICHIER ptrs. Je suppose que c'est ce que Microsoft veut dire quand ils disent "stdio faible niveau d'e /s".

/MD /MT /LD (Utilisation de la Bibliothèque Run-Time) dit:

Tous les modules passé à une invocation de la
l'éditeur de liens doit avoir été compilé avec le même temps d'exécution
bibliothèque de l'option de compilateur (/MD /MT /LD).

Il n'est pas dire que tous les modules doivent être compilées par la même version du compilateur. Je ne l'utilisation de /MD (ou /MDd) de façon correcte et systématique pour tous mes modules.

Lors de l'utilisation de Dll, il apparaît que la Dll non seulement d'utiliser le même commutateur /MD, mais ils doivent aussi être compilé par VS2010?

Mon cas de test, ce qui semble indiquer que le lien avec les bibliothèques statiques générées par VS2008 fonctionne, mais j'ai peut-être eu de la chance? Pourquoi lier à VS2008 généré bibliothèques statiques de travail, tout en les reliant à un VS2008 généré DLL n'a pas lors de l'utilisation de VS2010?

Est-ce à dire que je dois livrer des Dll distinctes pour une utilisation par VS2008 et VS2010 utilisateurs?


Et que dire de la nouvelle Plate-forme d'Outils option? Peut VS2010 aux utilisateurs de changer que de v900, même si elles n'ont pas de VS2008? Si oui, alors je pourrais juste dire aux gens de changer ce paramètre pour mon Leptonlib-1.67 projet.


Enfin, j'ai utiliser le commutateur /Z7 lors de la création de mes bibliothèques. La documentation à /Z7, /Zi, /ZI (Informations de Débogage Format) états:

/Z7

Produit une .obj fichier contenant plein symbolique
les informations de débogage pour une utilisation avec le débogueur.
Les informations de débogage symbolique inclut les noms
et les types de variables, ainsi que des fonctions et de la ligne
les numéros. Pas de .fichier pdb est produite.

Pour les distributeurs de bibliothèques de tiers, il est
un avantage à ne pas en avoir un .fichier pdb. Cependant, l'
.les fichiers obj pour les en-têtes précompilés sont nécessaires
au cours de la phase de liaison, et de débogage. Si ce n'est que
type d'information (et pas de code) dans l' .pch fichiers de l'objet,
vous aurez également à compiler avec
/Yl (Injecter de la PCH de Référence pour le Débogage de la Bibliothèque).

Je ne suis pas à l'aide de tous les en-têtes précompilés. Toutefois, c'est seulement quand j'ai le .apb que je peux déboguer mon Leptonica Dll. Aussi, même si elle dit "Pas de .fichier pdb est produit.".apb est en fait généré avec mes paramètres de projet en cours. Le fait d'avoir /APB dans mon linker options en quelque sorte remplacer après avoir spécifié /Z7 lors de la compilation?

Edit: Aussi, je dois mentionner que j'ai suis en mesure de débogage de la bibliothèque statique version de Leptonica même sans APB.

Références

Leptonica est de l'open-source C librairie de Traitement d'Image par Dan Bloomberg disponible à http://www.leptonica.com. - Je fournir les instructions pour construire Leptonica à l'aide de VS2008/VS2010 et également fournir des binaires pour windows.

Voir http://leptonica.com/vs2008doc/building-leptonlib.html et http://leptonica.com/vs2008doc/building-image-libraries.html pour plus de détails sur la manière dont je construis le Leptonica bibliothèques. http://www.leptonica.org/vs2008doc/building-prog-dir.html explique comment je lien ioformats_reg.

Mon Leptonica VS2008 Solution est disponible à http://www.leptonica.com/source/vs2008-1.67.zip. Mon bibliothèques binaires sont dans le fichier zip à http://leptonica.com/source/leptonica-1.67-win32-lib-include-dirs.zip. Le Leptonica sources sont à http://www.leptonica.com/source/leptonlib-1.67.tar.gz

OriginalL'auteur T Powers | 2010-11-13