2008-09-29 2 views
3

Я получил сообщение действительно нечетным ошибка, которая возникает только тогда, когда я добавить следующую строку в мой проект:Странная MFC/VC++ Linker Error (станд :: Список <CRect> уже определен)

std::list<CRect> myVar; 

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

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

Ошибка 1 Ошибка LNK2005: "общественность: __thiscall станд :: Список

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

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

Я получаю ошибку линкера, чтобы уйти, если я изменить строку кода на:

std::list<CRect*> myVar; 

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

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

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

Edit: ошибка линкера выше для станд :: Список <> конструктор, я получаю сообщение об ошибке для деструктора, _Nextnode и четких функций.

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

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

+0

У вас есть код для SomeLowLevelLibrary.lib. Если это так, скопируйте исходный код для списка и посмотрите, что вы получите взамен. – 2008-09-29 10:32:39

+0

Можете ли вы предоставить информацию о связи с библиотеками MFC (статические, общие) как вашего проекта, так и SomeLowLevelLibrary.lib. – 2008-09-29 10:45:59

ответ

1

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

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

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

0

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

0

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

2

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

0

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

0

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