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

StackOverflow https://stackoverflow.com/questions/148178

  •  02-07-2019
  •  | 
  •  

Вопрос

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

std::list<CRect> myVar;

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

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

Ошибка 1 ошибка LNK2005:"общественность:__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.

Это было полезно?

Решение 2

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top