GCC style de la faiblesse des liens dans Visual Studio?
GCC a la capacité de faire un symbole de lien faiblement via __attribute__((weak))
. Je veux utiliser la un faible le symbole dans une bibliothèque statique que les utilisateurs peuvent remplacer dans leur application. GCC style faibles symbole permettez-moi de le faire, mais je ne sais pas si cela peut être fait avec visual studio.
Visual Studio offre une fonctionnalité similaire?
- Voir Windows Statique de la Bibliothèque de Fonctions par Défaut. Est-ce que vous voulez réaliser?
- Voir le réponse de Michael Burr -- MSVC fait défaut à ce comportement. Si vous remplacez un symbole qui est déjà défini dans une dépendance lib, le symbole, dans la
.lib
seront ignorées silencieusement.
Vous devez vous connecter pour publier un commentaire.
MSVC++ a
__declspec(selectany)
qui couvre une partie de la fonctionnalité de la faiblesse des symboles: il vous permet de définir plusieurs symboles identiques avec une liaison externe, de diriger le compilateur de choisir l'un de plusieurs disponibles. Cependant, je ne pense pas que MSVC++ a rien qui permettrait de couvrir l'autre partie de la faiblesse symbole de la fonctionnalité: la possibilité de fournir des "remplaçable" définitions dans une bibliothèque.Ce, d'ailleurs, est à se demander comment le standard remplaçable
::operator new
et::operator delete
fonctions œuvres dans MSVC++.main()
, afin de laisser tout le code, y compris ce fichier overridemain()
?::operator new
navires sous forme de code objet à l'intérieur denothrownew.obj
. Je suppose que le CRT utilise un concept similaire au__fltused
-trick pour le code de l'objet tiré dans le module, sauf s'il a été défini par ailleurs. Le classique de l'éditeur de liens de règles pour OBJs et LIBs sont décrites dans le Le Vieux Chose de Nouveau.Vous pouvez le faire, voici un exemple en C:
MSVC utilisé pour se comporter de telle sorte que si un symbole est défini dans un .fichier obj et .lib elle serait d'utiliser l'un sur la .fichier obj, sans avertissement. Je me souviens qu'il serait également gérer la situation où le symbole est défini dans plusieurs libs elle serait d'utiliser l'un à la bibliothèque qui est nommé en premier dans la liste.
Je ne peux pas dire que j'ai essayé ceci dans un moment, mais je serais surpris si ils ont changé ce problème (surtout que .obj symboles définis remplacer les symboles .fichiers lib).
Il n'y a pas un MS-VC équivalent à cet attribut. Voir http://connect.microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-c-c. Je vais proposer quelque chose d'horrible: la lecture de la fin de celui-ci ici: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html il s'agit essentiellement de définir des fonctions qui, si leurs symboles existent, sont utilisés, autrement, ne sont pas, donc...
Pourquoi ne pas utiliser le pré-processeur pour cet effet, avec l'énorme inconvénient de "si vous avez besoin de faire tout cela"? (Je ne suis pas un fan de recommander pré-processeur).
Exemple:
ensuite appeler de façon appropriée dans la logique de l'application, entouré par
#ifdef
consolidés. Si votre bibliothèque statique est lié, dans le cadre de la mise en relation dans le processus, d'ajuster le définit à définir USE_MY_FUNCTION.Pas tout à fait un équivalent direct et très laid, mais c'est le mieux je pense.
La seule façon que je sais. Placez chaque symbole dans une autre bibliothèque. Les objets utilisateur avec les remplacements doivent également être combinée à la bibliothèque. Puis les lier tous ensemble pour une application. L'utilisateur de la bibliothèque doit être spécifié en tant que fichier d'entrée, votre lib doit être transféré à l'éditeur de liens à l'aide de
/DEFAULTLIB:
option.Une façon de le faire serait de mettre en place manuellement via LoadLibrary et GetProcAddress.
someLib.oldFunc = newFunc