2009-10-06 4 views
3

Existe-t-il un moyen multiplate-forme pour exporter certaines fonctions et structures à partir d'un projet C qui construit une bibliothèque partagée? Je veux faire d'une manière qui ne nécessite pas de système de construction spécifique (la visibilité devrait être définie dans le code, par exemple comme une macro), et d'une manière que GCC et MSVC peuvent comprendre.Exportation de symboles de bibliothèque partagée de manière croisée?

Merci.

+0

... un copier/coller? – pmg

+0

vérifiez cela: http://stackoverflow.com/questions/2164827/explicitly-exporting-shared-library-functions-in-linux –

Répondre

4

Strictement non, bien sûr, car les chaînes d'outils ne sont pas les mêmes.

Mais les gens le font. Les complexités sont que dans les fenêtres, vous devez étiqueter spécifiquement les déclarations de fonctions que vous souhaitez exportés à partir une DLL avec __declspec(dllexport) à l'emplacement dans la bibliothèque où la fonction est définie et __declspec(dllimport) dans les endroits dans le code client où la fonction est référencée. Parce que la pratique standard C n'a qu'une seule déclaration dans un seul fichier d'en-tête, cette signifie que vous devez généralement effectuer un travail de macro pour avoir un seul préfixe qui fonctionne dans les deux emplacements. Il semble que chaque projet choisit sa propre norme pour cela. Du côté d'Unix, il n'est pas nécessaire d'étiqueter les exportations, ce qui est bien. C'est parce que chaque fonction non-statique est exportée par défaut, ce qui n'est pas si agréable. Souvent, vous pouvez vous en sortir aussi longtemps que vos symboles non-publics/non-statiques ont des préfixes sains, ce que la plupart des projets semblent faire. Si vous avez besoin d'un contrôle plus fin sur vos symboles exportés , vous pouvez utiliser un "mapfile" de style Solaris avec l'argument --version-script (-M sous solaris) de l'éditeur de liens GNU pour définir explicitement quels symboles doivent apparaître dans l'espace de nom externe .

Il y a quelques plus de gotchas entre les plates-formes, comme le fonctionnement de l'espace de noms global par bibliothèque et la gestion du code de démarrage/arrêt . Fondamentalement, c'est un nid de rats qui ne peut pas être expliqué clairement dans un article de cette courte, mais tant que vous êtes prudent que votre bibliothèque contient des fonctions simples et votre espace de noms ne pollue pas, vous ne devriez pas avoir beaucoup difficulté. Regardez quelques-unes des bibliothèques partagées les plus répandues (par exemple Qt, Glib/Gtk +, distribué avec msys, etc ...) pour vous guider.

Questions connexes