Я работаю над созданием rLog для сборки в виде DLL под Windows, и я получаю неопределенные ошибки символов, связанные с некоторыми глобальными символами в пространстве имен rlog. В частности, это в RLogChannel.cpp:
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 );
...
};
Я предположил, что проблема заключалась в том, что 1) они не были экспортированы и 2) они не были объявлены в заголовке, чтобы другие вещи могли получить к ним доступ. Поэтому я добавил к ним __declspec (dllexport) (через макрос RLOG_DECL) и в заголовке поставил:
namespace rlog {
...
RLOG_DECL extern RLogChannel *_RLDebugChannel;
RLOG_DECL extern RLogChannel *_RLInfoChannel;
RLOG_DECL extern RLogChannel *_RLWarningChannel;
RLOG_DECL extern RLogChannel *_RLErrorChannel;
...
};
Но как бы я ни объявлял переменные в RLogChannel.cpp, я получаю ошибку переопределения, несмотря на то, что они меняются в заголовке ... Какой правильный способ сделать это? Кажется, это должно быть просто, но я не могу обернуть голову вокруг него.
Редактировать: сообщение об ошибке
Error 12 error C2086: 'rlog::RLogChannel *rlog::_RLDebugChannel' : redefinition rlog-1.4\rlog\RLogChannel.cpp 45 rlog
(одинаково для всех 4 символов)
Редактировать: я не знаю, что произошло, код точно такой же, но сейчас он будет компилироваться (похоже на странность MSVC ...), к сожалению, символы все еще отображаются как неразрешенные при соединении с моей библиотекой