8
votes

Utilisation de STL dans une bibliothèque à source fermée

est-il sûr d'utiliser une STL compatible standard dans une bibliothèque et une autre dans un projet qui utilise cette bibliothèque? Par exemple:

//library.h

#include <string>  //let's say here it uses minGW STL

void Foo(std::string& str_mingw);

//library.cpp
void Foo(std::string& str_mingw) { /*do something*/ }



//application.cpp

#include "library.h"
#include <string>  //let's say here it uses VStudio STL

void Bar()
{
  std::string str_vstudio;
  Foo(str_vstudio);
  //Foo() inside the .lib or .dll uses string from minGW,
  //but here a string from VStudio is used
}


4 commentaires

Windows / Minwg N00B demande: Pourquoi ne pouvez-vous pas utiliser le vs stl avec Mingw?


Le titre ne devrait-il pas vraiment être quelque chose comme "en utilisant plusieurs bibliothèques standard dans un seul projet"? Être à la source fermé ne semble pas pertinent à la question actuelle de la question posée.


@Mark B i spécifiées "Source fermée" car une bibliothèque open source peut être compilée par les clients avec n'importe quoi qu'ils aiment, donc il n'y a certainement aucun problème.


Merci à tous pour vos réponses. Je l'obtiens maintenant.


4 Réponses :


4
votes

Cela dépend de la bibliothèque, de la plate-forme et de la compilation et de la relier. Souvent (ESP On Windows) Les bibliothèques sont distribuées en tant que DLL, et il existe des règles très spécifiques sur ce qui peut être sur les limites et comment chaque doit être compilé.

Boost, par exemple, construit des DLL pour:


1 commentaires

et ne placez aucun d'entre eux dans Winsxs. Mauvais!



6
votes

est-il sans danger d'utiliser une STL compatible standard dans une bibliothèque et une autre dans un projet qui utilise cette bibliothèque?

non.

Certaines parties de STL pour une réutilisation sont placées dans une bibliothèque partagée. Il est impossible de garantir que la structure interne des classes correspondrait aux différents STL qui conduisaient donc à des accidents sporadiques si les deux sont utilisés par un programme interchangeable.

Notez également que les STLS de différents fournisseurs pourraient avoir une organisation différente d'espaces de noms internes et de classes. Qui a pour effet que le symbole public std :: basique_string peut avoir des noms internes différents et serait muté différemment, rendant Void FOO (std :: string & str_mingw); et et et et et et Void FOO (std :: string & str_vstudio); de la perspective de liaison deux fonctions différentes.


0 commentaires

6
votes

Si - par bibliothèque - Vous voulez dire une bibliothèque dynamique - la réponse simple est la suivante: non et la réponse complexe est: non.

C ++ et des bibliothèques dynamiques sont une perspective très très fragile. Toute petite modification nécessite une reconstruction de tous les modules et que l'exécution utilisée par chaque bibliothèque doit être exacte de la même instance de bibliothèque.

Même si vous avez réussi à obtenir une chaîne STD :: String sur une limite DLL - tandis que l'interface externe de STD :: String est corrigée, les différences de mise en œuvre permettront que les données apparaissent corrompues.

Il est uniquement sûr de passer des structs de POD simples et des types de données natives entre les bibliothèques dynamiques si les roulements sont potentiellement différents - et même en tant que des soins doivent être pris pour gérer les vies de l'objet correctement - la bibliothèque d'allocation doit être la bibliothèque de désaffectation.

Si vous voulez dire une bibliothèque statique - cela ne fait pas une énorme quantité de sens - je ne pense pas que les libs fabriqués par Mingw seront compatibles avec MSDev et MSDev Libs sont incompatibles avec MINGW. Même si le format de fichier LIB soit compatible de manière nominale - en supposant que les manglages de nom différent ne provoquent pas une lingue réussie: la bibliothèque STL de l'environnement de liaison final serait utilisée.


0 commentaires

1
votes

est-il sûr d'utiliser une norme STL compatible dans une bibliothèque, et un autre dans un projet qui utilise cela une bibliothèque? ... void foo (std :: string & str_mingw); ... foo (str_vstudio);

non. Il n'a même pas trop de choses à voir avec des bibliothèques dynamiques. Même si vous avez réussi à lier à la fois la STD STD :: String et Mingw STD :: String dans la même exécutable, cela se briserait toujours. Vous avez deux définitions séparées (probablement différentes) de STD :: String dans votre programme et si vous les mélangez, vous êtes dans un comportement indéfini.

Notez cependant que cela fonctionnerait si votre STD :: String n'est pas utilisée dans l'interface. C'est-à-dire que vous pouvez avoir une bibliothèque qui utilise des chaînes MINGW en interne et une autre lib qui utilise des chaînes VC à l'intérieur tant que vous utilisez Cons-Char * (à titre d'exemple) au niveau de l'interface.


0 commentaires