est ici un simple ensemble de fichiers qui reproduisent le problème que je vais avoir:Appel de la méthode statique C++ de C donne les références non définies lors de la compilation
ch:
void dummy();
c.cpp:
#include <stdio.h>
extern "C" {
#include "c.h"
}
class Bubu {
public:
static Bubu *getInstance() {
if (_instance == NULL) {
_instance = new Bubu;
}
return _instance;
}
private:
static Bubu *_instance;
};
Bubu *_instance = NULL;
void dummy() {
printf("bubu called\n");
Bubu *ptr = Bubu::getInstance();
}
main.cpp:
extern "C" {
#include "c.h"
}
int main() {
dummy();
return 0;
}
Quand je compile je reçois ceci:
g++ -W -Wall -c c.cpp -o c.o
c.cpp: In function ‘int bubu()’:
c.cpp:24: warning: unused variable ‘ptr’
g++ -W -Wall main.cpp c.o -o main
c.o: In function `Bubu::getInstance()':
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x7): undefined reference to `Bubu::_instance'
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x1d): undefined reference to `Bubu::_instance'
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x24): undefined reference to `Bubu::_instance'
collect2: ld returned 1 exit status
make: *** [main] Error 1
Compilation exited abnormally with code 2 at Tue Dec 15 09:15:21
J'ai vu la réponse à d'autres questions similaires mais le problème est soit un manque Bubu :: lorsque vous appelez la méthode statique ou de l'absence d'initialisation de l'organe statique extérieur la déclaration de classe ou la construction extern "C" manquante. Je suis à peu près certain que je ne fais pas ces erreurs ... Je fais définitivement d'autres choses. Pouvez-vous s'il vous plaît expliquer ce qui se passe?
Je pense que cela a à voir avec le mangling de nom https://en.wikipedia.org/wiki/Name_mangling – dvhh
'Bubu * Bubu :: _ instance'? –
Et qu'en est-il de 'Bubu * Bubu :: _ instance = NULL;'? – LogicStuff