2009-08-19 4 views
3

J'ai le problème suivant: Mon projet (C++ -) se compose de plusieurs sous-projets. Dans chacun, j'ai plusieurs fichiers avec le code que je veux exécuter au démarrage. Ma solution à ce jour est d'utiliser des variables statiques qui appellent le code correspondant à l'initialisation comme ceci:Comment empêcher l'éditeur de liens d'optimiser le code de démarrage?

// Foo.cpp 

static TFooRegistry sFooRegistry; // does stuff in constructor. 

Lors de la construction de mon projet à l'aide dll pour chaque sous-projet, tout fonctionne très bien et le code est exécuté comme prévu. Cependant, lors de la liaison statique des sous-projets, l'éditeur de liens détermine que Foo.o ne contient aucun code référencé de l'extérieur et l'optimise. Bien sûr, je pourrais ajouter une référence à sFooRegistry ailleurs, mais c'est fastidieux et sujet aux erreurs.

Quels sont les moyens (normatifs) de résoudre ce problème? OK, que puis-je faire sur mac/gcc et win/visual studio?

Répondre

4

Il n'y a pas de façon standard conforme de forcer les objets dans les bibliothèques à être initialisé - vous devez utiliser des astuces en fonction de votre plate-forme (s) particulier. La différence entre une DLL et une bibliothèque statique (sous Windows, au moins) est que le ancien a un code de démarrage et d'arrêt exécuté par le système d'exploitation, alors que le dernier n'est qu'une concaténation de fichiers objets.

En outre, l'éditeur de liens n'optimise pas votre code de démarrage - il ne le lie simplement pas, car il n'est apparemment jamais utilisé. Linkers sont des bêtes assez stupides - si vous voulez savoir comment ils font ce qu'ils font, jetez un oeil au livre Linkers & Loaders.

+0

Doh! Cher Bjarne: Pourquoi? – Tobias

+0

Quelle est la différence entre un éditeur de liens optimisant le code et ne le liant pas? Je pensais que c'était juste deux noms pour la même chose. – Tobias

+0

C++ a été conçu pour fonctionner avec les lieurs existants (voir le livre D & E de Stroustrup) qui n'avait pas de concept de constructeur. –

1

Une astuce, mais passez en revue. Pour le système Win (mais pas Linux), utilisez explicitement dllexport - dans ce cas, l'éditeur de liens ne sait pas si ce symbole est utilisé par l'application externe ou non.

Questions connexes