Considérez mon petit exemple de bibliothèque C :
#include <external_library.h>
void some_function(void)
{
external_library_call();
// Do other stuff...
}
Elle prévoit de rendre la fonction some_function() publiquement appelable. La bibliothèque ne fonctionne pas, cependant, parce que la bibliothèque externe qu'elle requiert utilise également une fonction appelée some_function(), qui a le même prototype. L'éditeur de liens de GCC ne se soucie pas du nombre de sources du symbole some_function. Il en choisit une apparemment au hasard et la bibliothèque externe peut ou non utiliser ma some_function() au lieu de la sienne. C'est insensé. Pas le fait que la bibliothèque ne fonctionne pas. Cette bibliothèque ne devrait définitivement pas fonctionner. C'est plutôt le fait qu'il y ait deux sources pour le symbole 'some_function', mais que l'éditeur de liens ne fasse rien à ce sujet. Et vous savez, cela ne me dérange pas trop parce que je suis habitué à ce que GCC et le C en général soient pathologiquement imprudents par défaut. Il doit y avoir un moyen, cependant, pour que l'éditeur de liens m'avertisse quand il y a deux sources pour le même symbole. J'ai déjà essayé -Wall -Wextra -Wshadow, mais cela ne produit aucun avertissement.
Notez que -fvisibility=hidden ne sera pas utile ici car les deux bibliothèques veulent exporter some_function(). Je sais que vous pouvez dire que j'ai honte de faire des appels de fonctions sans préfixe unique. Vous avez raison. C'est une erreur. Mais je m'en moque. Cette erreur est rattrapable par l'éditeur de liens et doit donc être rattrapée. Il n'y a aucune raison pour que l'éditeur de liens n'attrape pas cette erreur. De plus, la bibliothèque que vous utilisez peut exporter des symboles étranges et inattendus, et vous n'avez pas nécessairement le contrôle sur ce que la bibliothèque de quelqu'un d'autre exporte. De plus, les préfixes ne peuvent pas être uniques avant que le programmeur ne s'arrête et ne prenne feu.