стандартная библиотека уже определена в lib, вызывая ошибку компоновщика - PullRequest
6 голосов
/ 14 декабря 2011

Не уверен, что я делаю не так, но скажу, что у меня есть:

foo.h

class foo
{
public:
int Get10(std::wstring);
};

foo.cpp

int foo::Get10(std::wstring dir)
{
   return 10;
};

И я скомпилирую ее как библиотеку, если я включу эту библиотеку в другой проект вместе с соответствующим заголовком (foo.h) и попытаюсь вызвать экземпляр foo:

foo f;
f.Get10(L"ABC");

Я получаю сообщение об ошибке компоновщика:

Ошибка 1, ошибка LNK2005: «public: __thiscall std :: _ Container_base12 :: ~ _Container_base12 (void)» (?? 1_Container_base12 @ std @@ QAE@XZ) уже определено в foo.lib (foo.obj) C: \ foo \ msvcprtd.lib (MSVCP100D.dll) footest

Есть идеи, почему это происходит?

Ответы [ 2 ]

22 голосов
/ 14 декабря 2011

Ошибка 1, ошибка LNK2005: "public: __thiscall станд :: _ Container_base12 :: ~ _Container_base12 (аннулируются)» (?? 1_Container_base12 @ std @@ QAE @ XZ) уже определен в foo.lib (foo.obj) C: \ foo \ msvcprtd.lib (MSVCP100D.dll) footest

Из того, что я вижу, это сообщение об ошибке означает, что вы пытаетесь включить библиотеку времени выполнения MSVC дважды. Это может быть связано с компиляцией foo.lib с параметром библиотеки времени выполнения: «Многопоточный (/ MT)» и тестовым проектом с параметром: «Многопоточный DLL (/ MD)», например.

Проверьте параметры среды выполнения в «Свойствах проекта» ==> «C / C ++» ==> «Генерация кода» для обоих проектов и убедитесь, что они одинаковы для обоих проектов.

0 голосов
/ 14 декабря 2011

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

#ifndef FOO_H_
#define FOO_H_

class foo
{
 public:
  int Get10(std::wstring);
}

#endif  // FOO_H_

Смотри также: http://en.wikipedia.org/wiki/Include_guard

...