alut,
Le mot clé extern, quand il s'applique à une déclaration de variable, indique au compilateur : ne t'en fais pas, cette variable n'existe peut-être pas dans l'unité de compilation sur laquelle tu travailles, mais elle existe bel et bien ailleurs".
Et, bien sur, cet "ailleurs" doit être... une autre unité de compilation.
Comme toutes les déclaration, ta déclaration permet uniquement au compilateur de savoir qu'il y a une variable globale nommée g_PCIBus qui "traine quelque part". Mais, quand l'éditeur de liens va passer par là, il faudra qu'il... trouve la définition (autrement dit: un espace mémoire suffisant que pour contenir toutes les informations requises par cette variable qui soit taggé "here lives g_PCIBus") de cette variable dans l'un des fichiers objets dans lesquels il va regarder.
Et pour que l'éditeur ait une chance de trouver cette définition, il faut... que la définition de la variable soit présente dans une (et dans une seule) unité de compilation.
Tu dois donc, en plus de déclarer ta variable externe, prévoir une unité de compilation qui contienne un code sensiblement très proche de
PCIBus* g_PCIBus = new PCIBus;
(et, bien sur, veiller à ce que l'instance pointée par g_PCIBus soit correctement initialisée au plus tard au moment où tu essayeras de l'utiliser)
PS: c'est fou comme j'ai l'impression d'être un perroquet, par moments...
Partager