[C++] Линкуется в релизе, но не в дебаге

erotic

Имеем библиотеку log4cpp с файлом CategoryStream, примерно такого содержания:

class __declspec(dllimport) CategoryStream {
public:
...
inline Priority::Value getPriority const throw {
return _priority;
};

template<typename T> CategoryStream& operator<<(const T& t) {
if (getPriority != Priority::NOTSET) {
if (!_buffer) {
if (!(_buffer = new std::ostringstream {
// XXX help help help
}
}
(*_buffer) << t;
}
return *this;
}

private:
Category& _category;
Priority::Value _priority;
union {
std::ostringstream* _buffer;
#if LOG4CPP_HAS_WCHAR_T != 0
std::wostringstream* _wbuffer;
#endif
};

public:
typedef CategoryStream& (*cspf) (CategoryStream&);

CategoryStream& operator<< (cspf);
LOG4CPP_EXPORT friend CategoryStream& eol (CategoryStream& os);
LOG4CPP_EXPORT friend CategoryStream& left (CategoryStream& os);
};


В своей библиотеке я включаю этот файл в файл Logger.h, а в Logger.cpp у меня функция, в которой есть такая строка:

logger << Priority::ERROR << "Creating logger from configuration file failed with error: " << exConfigure.what
<< "\nUsing default logger";

Теперь пытаюсь собрать приложение, используя свою библиотеку и log4cpp. В релизе собирается нормально, в дебаге линкер выдает ошибку:
Linking...
log4cpp-d.lib(log4cpp-d.dll) : error LNK2005: "public: int __thiscall log4cpp:: getPriority(void)const " (?gCate@QBEHXZ) already defined in MyLib-d.lib(Logger.obj)
Creating library E:\var\programming\my_app\trunk\Debug_Dynamic\my_app.lib and object E:\var\programming\my_app\trunk\Debug_Dynamic\my_app.exp
E:\var\programming\my_app\trunk\Debug_Dynamic\my_app.exe : fatal error LNK1169: one or more multiply defined symbols found
Мне это кажется очень странным.
Если упомянутою выше строку заменить этой:

logger.error(string("Creating logger from configuration file failed with error: ") + exConfigure.what
+ "\nUsing default logger";

то все собирается нормально и в дебаге, и в релизе.
Можете объяснить, где я неправ?

Realist

CategoryStream какое расширение имеет? .h или .cpp?

erotic

h, включается в Logger.h, Logger.h включается в my_app

Dasar

в debug-е он у тебя по идее все inline-ы размещает как не inline, соответственно у тебя получается две функции одна в либе, другая в проге.

erotic

Не может же из-за этого проект не собираться!
У меня есть куча инлайн функций, они все используются в разных библиотеках, потом при сборке приложения все эти библиотеки собираются с приложением, но ведь в них такой ошибки не возникает.
Возможно, косяк в том, это эта функция импортируется в .dll, а если, как ты говоришь, в дебаге все inline функции тоже пихаются в объектник, то получается определение в .dll и в проге. Но вроде MicroSoft заявляет, что такого быть не должно.
Опять-таки, дело вот еще в чем - я использую оператор << для логгера, который и вызывает getPriority, в куче других модулей, которые тоже линкуются с приложением, но такая ошибка вылетает почему-то именно тогда, когда этот оператор используется в Logger.cpp
Оставить комментарий
Имя или ник:
Комментарий: