Je travaille sur l'obtention de rLog pour construire sous forme de DLL sous Windows, et j'obtenais des erreurs de symboles non définis concernant certains symboles globaux dans l'espace de noms rlog. Plus précisément dans ces RLogChannel.cpp:Comment utiliser correctement extern dans un espace de noms?
namespace rlog {
...
RLogChannel *_RLDebugChannel = GetGlobalChannel("debug", Log_Debug);
RLogChannel *_RLInfoChannel = GetGlobalChannel("info", Log_Info);
RLogChannel *_RLWarningChannel = GetGlobalChannel("warning", Log_Warning);
RLogChannel *_RLErrorChannel = GetGlobalChannel("error", Log_Error);
...
};
Je suppose que le problème était que 1) ils ne sont pas exportés et 2) ils n'ont pas été déclarés dans l'en-tête pour que d'autres choses peuvent y accéder. Donc, j'ai ajouté un __declspec (dllexport) (via la macro RLOG_DECL) pour eux, et dans l'en-tête, mis:
namespace rlog {
...
RLOG_DECL extern RLogChannel *_RLDebugChannel;
RLOG_DECL extern RLogChannel *_RLInfoChannel;
RLOG_DECL extern RLogChannel *_RLWarningChannel;
RLOG_DECL extern RLogChannel *_RLErrorChannel;
...
};
Mais peu importe comment je déclare les variables RLogChannel.cpp je reçois une erreur de redéfinition, en dépit mon externe les dans l'en-tête ... Quelle est la bonne façon de faire cela? On dirait que ça devrait être simple mais je ne peux pas tout à fait enrouler ma tête autour d'elle.
Edit: message d'erreur
Error 12 error C2086: 'rlog::RLogChannel *rlog::_RLDebugChannel' : redefinition rlog-1.4\rlog\RLogChannel.cpp 45 rlog
(même pour les 4 symboles)
Edit: Je ne sais pas ce qui est arrivé, le code est exactement le même avant, mais maintenant il compilera (sent comme étrangeté MSVC ...), malheureusement les symboles apparaissent encore comme non résolus lors de la liaison dans ma bibliothèque
ce qui est exactement un message d'erreur –
Mise à jour ci-dessus il est formaté un peu plus agréable que moi? peut poster ici –
On dirait quelque chose importa Il a été exclu de la question. Pouvez-vous fournir un cas de test concis et complet (par exemple un fichier que je peux transmettre au compilateur tel quel) qui donne cette erreur? –