LNK 2005 в Visual C ++ в Visual Studio 2010 - PullRequest
       23

LNK 2005 в Visual C ++ в Visual Studio 2010

7 голосов
/ 20 февраля 2011

Я пытаюсь скомпилировать программу C ++, написанную с использованием Visual C ++ 2005 и MFC, в MS VS 2010. К сожалению, я получаю следующую ошибку во время компиляции:

Error 2 error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already defined in CMemDCImpl.obj Project\Project\Project\uafxcwd.lib(afxglobals.obj) Project.

У CMemDCImpl есть заголовокфайл, содержащий определения всех членов класса CMemDCImpl, и файл * .cpp с их реализациями.Пожалуйста, помогите мне исправить эту ошибку.

Ответы [ 3 ]

6 голосов
/ 20 февраля 2011

Вы упоминаете, что ваш CMemDCImpl определен в файле cpp.Однако, похоже, что он также определен в uafxcwd.lib (библиотека, которую вы, очевидно, используете).Я могу думать о двух возможностях этой ошибки:

  1. Вы включаете cpp библиотеки, которую пытаетесь использовать.Обычно, когда вы используете предварительно скомпилированную библиотеку, вам нужно только ссылаться на файл заголовка в вашем собственном исходном файле и библиотеке во время компоновки.Возможно ли, что вы включили исходные файлы .cpp библиотеки в свой собственный проект?Если это так, просто удалите исходные файлы .cpp из своего проекта.
  2. Вы определяете собственный класс, имя которого совпадает с именем, на которое вы ссылаетесь в библиотеке, и у вас естьстолкновение имен.Предпочтительным методом решения этой проблемы является инкапсуляция класса, который вы сами определили, в пространство имен:

.

namespace Foo
{
    class CMemDC
    {
        // ...
    };
}

// Usage:
Foo::CMemDC myMemDC;
3 голосов
/ 20 февраля 2011

Без реального кода мы можем только догадываться.Скорее всего, вы сделали одно из следующих действий:

  • Реализовано CMemDC::~CMemDC() {} дважды, возможно, копировальная паста, которую вы не переименовали в CMemDCImpl::~CMemDCImpl()
  • Реализована CMemDC::~CMemDC() вфайл заголовка после CMemDC определения класса вместо в определения класса
2 голосов
/ 01 апреля 2012

Решение, которое я использую: переименуйте известный и хорошо используемый класс CMemDC во что-то как CMemDc

потому что Microsoft сокрушил это, а Кит или мы сами не защищали авторские права?!?

в vs2k10 Microsoft осмелилась сокрушить название класса CMemDC Кейта с некоторым дерьмом.

Вчерашние ребята из Microsoft: это один из самых популярных классов, которыми все пользуются с 1997 года! Gross! Позор вам, Microsoft!

CMemDc - память DC

// Автор: Keith Rule

// Электронная почта: keithr@europa.com

// Авторское право 1996-1997, Keith Rule

Спасибо, Кит! Эти "новые" и "катастрофические" парни из "After-Gates" хотят, чтобы мы меняли каждый "CMemDC" во всех наших источниках ... Какой позор

...