Question

J'ai une application qui est à l'aide d'une bibliothèque statique j'ai fait. Un fichier .cpp dans la bibliothèque a une déclaration variable statique, dont le cteur appelle une fonction sur un singleton qui fait par exemple quelque chose- ajoute une chaîne.

Maintenant, quand j'utilise cette bibliothèque de l'application, mon singleton ne semble pas contenir de traces de la chaîne qui était censé être ajouté.

Je suis vraiment manque quelque chose, mais je ne sais pas quoi ..

Était-ce utile?

La solution

Si vous avez un objet dans une bibliothèque statique qui est pas EXPLICITE utilisé dans l'application. Ensuite, l'éditeur de liens ne tire pas l'objet de la lib dans l'application.

Il y a une grande différence entre les bibliothèques statiques et dynamiques.

Bibliothèque dynamique:
A rien moment de la compilation est tiré de la bibliothèque dynamique. code supplémentaire est ajouté à charger explicitement et résoudre les symboles à l'exécution. Au moment de l'exécution toute la bibliothèque est chargée et objet ainsi initialiseurs sont appelés (mais quand est le détail de la mise en œuvre).

Les bibliothèques statiques sont traitées différemment:
Lorsque vous établissez un lien avec une bibliothèque statique, il tire tous les éléments qui ne sont pas définis dans l'application qui sont définies dans la bibliothèque dans l'application. Cette opération est répétée jusqu'à ce qu'il n'y a plus de dépendances que la bibliothèque peut résoudre. L'effet secondaire de ceci est que les objets / fonctions ne sont pas explicitement utilisés ne sont pas tirés forme la bibliothèque (donc des variables globales qui ne sont pas directement accessibles ne sera pas tiré).

Autres conseils

Ma mémoire de c'est un peu brumeux, mais vous pourriez obtenir frappé avec un problème d'ordre d'initialisation. Il n'y a aucune garantie dans quel ordre initializers variables statiques dans différents fichiers obtenir appelé, donc si votre singleton n'est pas encore initialisé lorsque votre variable statique dans la bibliothèque est en cours d'initialisation, qui pourrait produire l'effet que vous voyez.

La façon dont j'ai eu l'occasion de ces problèmes est d'avoir une sorte d'une fonction init explicite qui fait ce genre de choses et que j'appelle au début de main ou quelque chose. Vous pourriez être en mesure de jouer avec l'ordre dans lequel vous donnez le fichier d'objet et les arguments de la bibliothèque au compilateur (ou éditeur de liens, en fait) parce que cela a aussi travaillé pour moi, mais cette solution est un peu fragile car il dépend non seulement sur l'utilisation du linker spécifique, mais probablement aussi la version spécifique.

Refactoriser les classes qui font l'initialisation statique afin qu'ils ne dépendent pas de tout autre type de cours. Autrement dit, faire l'initialisation de chaque classe indépendante et autonome.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top