dll question de point d’entrée / conseil nécessaire

J’ai une bibliothèque dynamic de code c ++ qui est multi-plateforme et principalement juste c ++ natif. J’utilise ensuite cette bibliothèque dynamic de mon exe principal. Jusqu’à présent, tout était bon sur OSX en utilisant gcc. Maintenant, je suis sur Windows Je suis confus quant à la méthode que je devrais utiliser pour entrer dans la DLL. Je n’ai pas de fonction DllMain pour le moment car cela n’était pas requirejs dans gcc (à ma connaissance). Mes premiers tests ont fonctionné, mais une inspection a révélé que, étrangement, un de mes constructeurs de classe était appelé à charger dll, alors je pensais que je devais faire quelque chose de plus sur Windows. Moi aussi:

  • append une fonction DllMain?
  • est-ce que je peux simplement utiliser l’option du compilateur noentry?

Lorsque je fais l’une des actions ci-dessus, je commence à recevoir des plaintes du compilateur dans la veine de “la section .CRT existe, il peut y avoir des initialiseurs ou des terminateurs statiques non gérés”

J’ai lu ceci en utilisant cet article , mais tous les conseils et la clarté sur la meilleure voie à suivre seraient grandement appréciés. C’est un peu flou dans ma tête quant à ce que je dois faire.

Basé sur l’erreur .CRT, vous avez certainement besoin d’une fonction DllMain. Pour la plupart des compilateurs Windows, un DllMain vous sera automatiquement fourni, de sorte que vous n’ayez pas à en écrire un vous-même. Basé sur d’autres parties de votre question, il semble très probable que vous utilisez Visual C ++, dont le CRT fournit un DllMain pour vous. Donc, même si vous avez besoin d’un DllMain, vous n’avez pas besoin d’écrire le code correspondant.

Le VC CRT DllMain par défaut est utilisé pour initialiser le CRT pour la DLL en question et pour initialiser toutes les variables statiques / globales fournies par la DLL.

Le modèle pour les DLL sur Unix et Windows est très différent, et vous devriez considérer chaque DLL comme ayant un ensemble plus «privé». Bien que, si toutes les DLL optent pour la même version de la DLL du CRT, une partie de cet état sera ensuite partagée.

Parce que le CRT fournit un DllMain pour vous, vous ne devez pas lancer / noentry sur l’éditeur de liens.

L’erreur de la section .CRT (que vous avez dû voir en lançant / noentry) vous indique que vous avez besoin d’un DllMain car vous avez un ou plusieurs objects dans votre DLL qui nécessitent une initialisation statique.

Martyn

Si c’est juste une bibliothèque, alors NOENTRY devrait suffire. DllMain est là pour contrôler les événements qui se produisent avec la DLL (par exemple, attacher, détacher, etc.).

Vous pouvez modifier le code (légèrement) pour éviter tous les points d’entrée, mais principal. Essentiellement, si vous avez une variable définie en dehors des fonctions (globalement mais pas statiquement liée), enveloppez-les dans un appel de fonction. Utilisez les variables de fonction statique souvent oubliées. Ie, changer la déclaration globale

 SomeType var_name; 

pour ça:

 SomeType & var_name(){static SomeType var; return var;} 

De même, vous pouvez modifier les variables d’instance de classe statiques en modifiant ceci:

 struct Container{ Container(); static Container instance; }; Container Container::instance; 

pour ça:

 struct Container{ Container(); static Container & instance(); }; Container & Container::instance(){ static Container var; return var; } 

Il s’agit essentiellement d’un singleton, mais il peut y avoir des problèmes de concurrence si la première fois que vous accédez à l’instance proviendra d’un environnement multithread. En fait, il ne faut pas oublier que, contrairement aux variables définies globalement, les variables statiques définies localement seront initialisées lors du premier appel de la fonction.