Question

GCC a la capacité de faire un lien de symbole faiblement via __attribute__((weak)). Je veux utiliser le symbole faible dans une bibliothèque statique que les utilisateurs peuvent remplacer dans leur application. Un symbole de style GCC faible me laisser faire ça, mais je ne sais pas si cela peut être fait avec le studio visuel.

Est-ce que Visual Studio offre une fonctionnalité similaire?

Était-ce utile?

La solution

MSVC ++ a __declspec(selectany) qui couvre une partie de la fonctionnalité des symboles faibles: il vous permet de définir plusieurs symboles identiques avec lien externe, diriger le compilateur de choisir l'une de plusieurs disponibles. Cependant, je ne pense pas que MSVC ++ a quelque chose qui couvrirait l'autre partie de faible fonctionnalité symbole:. La possibilité de fournir des définitions « remplaçables » dans une bibliothèque

, BTW, fait une merveille comment le soutien pour les fonctions de ::operator new et ::operator delete interchangeables standard fonctionne dans MSVC ++.

Autres conseils

Vous pouvez le faire, voici un exemple en C:

/*
 * pWeakValue MUST be an extern const variable, which will be aliased to
 * pDefaultWeakValue if no real user definition is present, thanks to the
 * alternatename directive.
 */

extern const char * pWeakValue;
extern const char * pDefaultWeakValue = NULL;

#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue")

MSVC utilisé pour se comporter de telle sorte que si un symbole est défini dans un fichier .obj et .lib qu'il utiliserait celui sur le fichier .obj sans avertissement. Je me souviens qu'il serait également gérer la situation dans laquelle le symbole est défini dans plusieurs libs il utiliserait celui de la bibliothèque nommée première dans la liste.

Je ne peux pas dire que je l'ai essayé cela dans un certain temps, mais je serais surpris s'ils ont changé ce comportement (en particulier que obj définis remplacent les symboles symboles dans les fichiers .lib).

Il n'y a pas d'équivalent MS-VC à cet attribut. Voir http: // connecter .microsoft.com / VisualStudio / rétroaction / détails / 505028 / add-faible-fonction-références-pour-visuel-cc . Je vais suggérer quelque chose d'horrible: lire le but de celui-ci ici: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html il est essentiellement de définir des fonctions qui, si leurs symboles existent, sont utilisés, sinon, ne sont pas, alors ...

Pourquoi ne pas utiliser pré-processeur à cet effet, avec la mise en garde énorme de « si vous avez besoin de le faire du tout »? (Je ne suis pas fan de recommander pré-processeur).

Exemple:

#ifdef USE_MY_FUNCTION
     extern void function();
#endif

puis appeler de manière appropriée dans la logique de l'application, entourée par des déclarations de #ifdef. Si votre bibliothèque statique est liée dans le cadre de la mise en relation en cours, modifier les définit pour définir USE_MY_FUNCTION.

Pas tout à fait un équivalent direct et très laid, mais il est le meilleur que je peux penser.

La seule façon que je connaisse. Placez chaque symbole dans une bibliothèque séparée. Les objets utilisateur avec les remplacements doivent également être combinés à la bibliothèque. lien ensuite tous ensemble à une application. bibliothèque de l'utilisateur doit être spécifié comme fichier d'entrée, vos lib doivent être de transférées à lieur en utilisant l'option /DEFAULTLIB:.

Une façon de le faire serait de mettre en œuvre manuellement par LoadLibrary et GetProcAddress .

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