Comment empêcher l'éditeur de liens de l'optimisation de distance du code de démarrage?
-
18-09-2019 - |
Question
J'ai le problème suivant: Mon (C ++ -) projet se compose de plusieurs sous-projets. Dans chaque cas, 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:
// 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 bien et le code fonctionne comme prévu. Lors de la liaison des sous-projets statiquement, cependant, l'éditeur de liens détermine que foo.o ne contient aucun code jamais référencé de l'extérieur et optimise loin. Bien sûr, je pourrais ajouter une référence à sFooRegistry ailleurs, mais cela est fastidieux et sujet aux erreurs.
Qu'est-ce que (norme conforme) les moyens de résoudre ce sont là?
OK, qu'est-ce que je peux faire sur mac / gcc et gagner / visual studio?
La solution
Il n'y a pas de façon standard de forcer des objets conforme à l 'dans les bibliothèques à initialisés - vous devez utiliser des astuces en fonction de votre plate-forme particulière (s). La différence entre une DLL et et une bibliothèque statique (sous Windows, au moins) est que le ancien a démarrage et le code d'arrêt qui est exécuté par le système d'exploitation, alors que celui-ci est juste une concaténation de fichiers objets.
En outre, l'éditeur de liens n'optimise pas votre code de démarrage - il est tout simplement pas créer de lien, car il est jamais utilisé apparemment. linkers sont des bêtes assez stupides - si vous voulez savoir comment ils font ce qu'ils font, jetez un oeil le livre Linkers et chargeurs .
Autres conseils
Certains truc, mais l'examiner. Pour le système Win (mais pas linux) utiliser dllexport explicite - dans ce cas linker doen't sait si ce symbole utilisé par l'application externe ou non
.