Comment empêcher l'éditeur de liens de l'optimisation de distance du code de démarrage?

StackOverflow https://stackoverflow.com/questions/1300778

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?

Était-ce utile?

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

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