2010-12-17 4 views
1

Je travaille avec VC9 sous Windows.Exportation de constantes à partir d'une DLL

J'ai une bibliothèque (permet de l'appeler libfoo) qui est fait des fichiers suivants (« inclure des gardes » et « #include » directives entendue rectifier pour des raisons de clarté):

// foo.hpp 

class Foo 
{ 
    public: 
    static const std::string SOME_CONST; 
}; 

Et:

// foo.cpp 

#include "foo.hpp" 

const std::string Foo::SOME_CONST = "hello"; 

Foo::SOME_CONST est exporté en utilisant un fichier .def.

La bibliothèque compile bien: un fichier libfoo.lib et un fichier libfoo.dll sont générés.

J'ai utilisé cette bibliothèque dans un exemple de programme, comme:

// main.cpp 

#include <foo.hpp> 

int main() 
{ 
    std::cout << Foo::SOME_CONST << std::endl; // std::bad_alloc here 

    return EXIT_SUCCESS; 
} 

Un std::bad_alloc est jeté chaque fois que je tente d'utiliser Foo::SOME_CONST.

Cela se produit uniquement si je liez dynamiquement à libfoo. Lier statiquement résulte dans un programme fonctionnant parfaitement.

Que pourrait-il se passer ici? Est-il légal d'exporter une std::string constante de cette façon?

+0

Avec 'dynamiquement' vous voulez dire utiliser GetProcAddress()? –

+0

@ur: Non, je veux dire utiliser libfoo en tant que DLL mais toujours lier un fichier 'libfoo.lib'. – ereOn

Répondre

2

Vérifiez que dll ne procède pas réellement à l'initialisation dynamique, car il ne l'est pas, la norme n'a pas d'exigences pour les bibliothèques dynamiques. Envelopper des globales dans des fonctions statiques peut être la solution.

1

Utilisez __declspec (dllexport) et __declspec (dllimport). Arrêtez de vous soucier des fichiers .def et de tous ces déchets - laissez le compilateur faire le travail.

+1

J'aimerais pouvoir malheureusement ... Je ne peux pas ... Il m'a fallu 5 mois pour convaincre mes collègues d'utiliser un système de contrôle de version. Aucune chance qu'ils abandonnent l'utilisation des fichiers '.def' avant la prochaine décennie. – ereOn

+1

Je souhaite qu'il y avait une meilleure option, mais la réalité est que __declspec est beaucoup plus puissant, fiable et utilisable. Ce que je suggère est, utilisez __declspec pour résoudre l'exemple de problème, puis demandez à vos collègues comment le résoudre avec un fichier .def, et si cela leur prend beaucoup de temps ou ils ne peuvent pas, alors ils devraient changer ou vous avez besoin nouveaux collègues. – Puppy

+0

Je vais essayer et vous tenir au courant. Je vous remercie. – ereOn

1

La bibliothèque et l'application principale sont-elles liées à la même version de la bibliothèque standard et/ou CRT et/ou MFC, avec exactement les mêmes paramètres? J'ai rencontré des problèmes d'allocation lors de l'utilisation de différentes versions du CRT, et j'ai également combattu des bogues causés par différents paramètres de débogage de l'itérateur entre une bibliothèque et son application.

+0

Oui, ils sont construits avec les mêmes outils et les mêmes options. J'ai reconstruit plusieurs fois la bibliothèque et le programme pour être vraiment sûr qu'ils ont été compilés de la même manière. – ereOn

Questions connexes