namespace et extern (multiple definition)
Bonjour à tous,
Je rencontre un sérieux problème en reprenant le C++ dans mon utilisation des namespace. J'essaie de faire un espace spécial pour les globales, d'où son nom, qui contient une variable et quelques fonctions. Le problème c'est que j'obtiens des erreurs pour le moins étrange !
D'un côté si j'utilise un extern pour la variable Log, le compilateur m'indique qu'il ne trouve pas de "Globals::Log" (erreur #1) ! Et si je l'enlève il m'indique je le définis plusieurs fois (dans main.cpp !!! erreur #2). En faisant avec le extern un make clean all (#1ère erreur) puis en l'enlevant et en refaisant un make ça compile et tourne.
main.cpp (l'header include globals.hpp)
Code:
1 2 3 4 5 6 7 8 9 10
| #ifndef MAIN_C
# define MAIN_C
#include "main.hpp"
int main(int argc, char *argv[]) {
Globals::Init();
Globals::Log(LOGGER_TYPE_DEBUG, LOGGER_CAT_SYSTEM, false, "Program is over");
}
#endif |
globals.hpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #ifndef GLOBALS_H
# define GLOBALS_H
#include <stdlib.h>
#include <stdarg.h>
#include "logger.hpp"
namespace Globals {
extern Logger log; /* extern ou non, tel est la QUESTION ! */
void Init();
void Log(unsigned int type, unsigned int cat, bool fatal, char *message, ...);
}
#endif |
globals.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #ifndef GLOBALS_C
# define GLOBALS_C
#include "globals.hpp"
void Globals::Init() {
loggerInit(&log);
log.toConsole = 1;
}
void Globals::Log(unsigned int type, unsigned int cat, bool fatal, char *message, ...) {
va_list args;
va_start(args, message);
loggerPush(&log, type, cat, message, args);
va_end(args);
if (fatal)
exit(EXIT_FAILURE);
}
#endif |
erreur #1:
Citation:
build/globals.o: In function `Globals::Init()':
src/globals.cpp:7: undefined reference to `Globals::log'
src/globals.cpp:8: undefined reference to `Globals::log'
build/globals.o: In function `Globals::Log(unsigned int, unsigned int, bool, char*, ...)':
src/globals.cpp:15: undefined reference to `Globals::log'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [main] Erreur 1
erreur #2:
Citation:
build/globals.o:src/globals.cpp:6: multiple definition of `Globals::log'
build/main.o:src/main.cpp:11: first defined here // je ne fais que l'utiliser pourtant !
build/socketserver.o: In function `SocketServer':
src/socketserver.cpp:6: multiple definition of `Globals::log' // pareil !
build/main.o:src/main.cpp:11: first defined here
build/socketserverlistener.o: In function `SocketServerListener':
src/socketserverlistener.cpp:6: multiple definition of `Globals::log' // pareil
build/main.o:src/main.cpp:11: first defined here
build/server.o: In function `Server':
src/server.cpp:6: multiple definition of `Globals::log'
build/main.o:src/main.cpp:11: first defined here
collect2: ld a retourné 1 code d'état d'exécution
make: *** [main] Erreur 1
Quelqu'un peut-il m'expliquer où est-ce que ça cloche svp ? Peut-être que le Makefile pose problème donc demandez moi de le poster si nécessaire.