Странная ошибка компоновщика MFC / VC ++ (std :: list <CRect>уже определен) - PullRequest
3 голосов
/ 29 сентября 2008

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

std::list<CRect> myVar;

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

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

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

:: list> (void) " (?? 0? $ Список @ VCRect @@ V? $ Распределитель @ VCRect @@@ @@@ станд станд @@ QAE @ XZ) уже определено в SomeLowLevelLibrary.lib

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

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

std::list<CRect*> myVar;

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

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

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

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

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

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

Ответы [ 6 ]

2 голосов
/ 30 сентября 2008

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

1 голос
/ 23 октября 2009

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

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

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

0 голосов
/ 02 октября 2008

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

0 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

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

0 голосов
/ 29 сентября 2008

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

...