Странная ошибка компоновщика MFC/VC++ (std::list‹CRect› уже определен)

У меня действительно странное сообщение об ошибке, которое появляется только тогда, когда я добавляю следующую строку в свой проект:

std::list<CRect> myVar;

Стоит отметить, что это не обязательно должен быть std::list, это может быть std::vector или любой другой контейнер STL, как я предполагаю.

Вот сообщение об ошибке:

Ошибка 1 ошибка LNK2005: "public: __thiscall std::list

::list >(void)" (??0?$list@VCRect@@V?$allocator@VCRect@@@std@@@std@@QAE@XZ), уже определенный в SomeLowLevelLibrary.lib

Библиотека низкого уровня, на которую ссылается сообщение об ошибке, не имеет представления о проекте, который я создаю, она имеет только основные функции низкого уровня и не работает с графическими интерфейсами MFC высокого уровня.

Я могу избавиться от ошибки компоновщика, если изменю строку кода на:

std::list<CRect*> myVar;

Но я не хочу взламывать его ради этого.

Кроме того, не имеет значения, создаю ли я переменную в стеке или в куче, я все равно получаю ту же ошибку.

У кого-нибудь есть какие-нибудь идеи по этому поводу? Я использую Microsoft Visual Studio 2008 SP1 на Vista Enterprise.

Редактировать: ошибка компоновщика выше для конструктора std::list‹>, я также получаю ошибку для деструктора, _Nextnode и четких функций.

Изменить: в других файлах проекта std::vector не будет связываться, в других файлах это может быть std::list. Я не могу понять, почему одни контейнеры работают, а другие нет. Связывание MFC является статическим в обеих библиотеках. В низкоуровневой библиотеке у нас есть 1 класс, который наследуется от std::list.

Изменить: в библиотеке низкого уровня нет классов, наследуемых от CRect, но она использует STL.


person Mark Ingram    schedule 29.09.2008    source источник
comment
У вас есть код для SomeLowLevelLibrary.lib. Если да, просмотрите исходный код list‹CRect› и посмотрите, что вы получите взамен.   -  person Jorge Ferreira    schedule 29.09.2008
comment
Можете ли вы предоставить информацию о привязке к библиотекам MFC (статическим, общим) как вашего проекта, так и SomeLowLevelLibrary.lib.   -  person Jorge Ferreira    schedule 29.09.2008


Ответы (6)


Вы должны смотреть на настройки компоновщика, но я не могу сразу сказать, какие. Обычно экземпляры STL выполняются в нескольких файлах. Компоновщик должен выбрать один. Все они идентичны (при условии, что у вас есть одинаковые настройки компилятора).

person MSalters    schedule 30.09.2008

Недавно я снова наткнулся на эту ошибку в нашем проекте и решил провести более тщательное расследование, чем просто исправить ее с помощью хака, как в прошлый раз (заменить std::list на CArray). Оказывается, одна из наших низкоуровневых библиотек наследовалась от std::list, т.е.

class LIB_EXPORT CRectList : public std::list<CRect>
{
};

Это не только плохая практика, но и причина ошибок компоновщика в основном приложении. Я изменил CRectList, чтобы обернуть std::list, а не наследовать от него, и ошибка исчезла.

person Mark Ingram    schedule 23.10.2009

Это не похоже на точный симптом, но, чтобы быть уверенным, вы должны убедиться, что ваш основной проект и все ваши включенные библиотеки используют один и тот же параметр «Библиотека времени выполнения» в разделе «С++: Генерация кода». Смешивание этих параметров может привести к ошибкам связи с библиотекой времени выполнения. (Что меня смущает в вашем случае, так это то, что вы можете избавиться от этого, изменив код, но стоит проверить, если вы еще этого не сделали.)

person jeffm    schedule 29.09.2008
comment
Да, это не поддержка во время выполнения, потому что мы используем ее повсеместно с MFC. - person Mark Ingram; 29.09.2008

Содержит ли SomeLowLevelLibrary.lib какие-либо классы с именем CRect или использует их? Он использует STL?

person JaredPar    schedule 29.09.2008

Включен ли файл в заголовок, который может быть скомпилирован в два отдельных модуля кода?

person Superpolock    schedule 30.09.2008

Сегодня мне в голову пришла еще одна случайная возможность. Возможно ли, что ваша текущая DLL и низкоуровневая библиотека ссылаются на две разные версии MFC? Дальний выстрел.

person JaredPar    schedule 01.10.2008