ошибка LNK2005: новое и удаление уже определены в LIBCMTD.lib (new.obj) - PullRequest
31 голосов
/ 18 июля 2009

У меня есть решение Visual Studio 2005, которое имеет два проекта. Одна представляет собой статическую библиотеку, а другая - исполняемый файл, используемый для проверки возможностей статической библиотеки. Статическая библиотека использует MFC. Я получил следующие ошибки при создании решения.

uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??    3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)

Я не знаю, как это преодолеть. Может кто-нибудь, пожалуйста, объясните, почему эта ошибка происходит. Будем весьма благодарны за любые объяснения, которые дают обзор ссылок на файлы .lib.

Ответы [ 16 ]

0 голосов
/ 28 апреля 2019

Я создал два свежих проекта с VS2017, один работал, другой нет, поэтому я сравнил разницу. Один рабочий был создан с помощью
File > New Project > Visual C++ > MFC/ATL > MFC Application
, а другой не был создан - с помощью
File > New Project > Visual C++ > Windows Desktop > Windows Desktop Wizard
с добавлением MFC. В обоих случаях я использовал MFC в качестве статической библиотеки. Я выяснил два исправления. Но перед этим мы должны добавить импорт, потому что второй проект имел NONE!

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes

Теперь у меня сработало одно из двух исправлений:

  1. Project > Properties > Configuration Properties > General > Use of MFC установите его для использования в Shared DLL, это также должно автоматически установить C/C++ > Code Generation > Runtime Library в Multi-threaded debug dll /MDd, чтобы убедиться, что это действительно так. Попробуйте скомпилировать сейчас, у меня это сработало.
  2. Я заметил, что у рабочего проекта был какой-то импорт в stdafx.h, я скопировал их в pch.h в другом проекте, он работал (оставив свойства без изменений, поэтому использовалась статическая библиотека). Код был скопирован так:
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit

// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS
#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions


#include <afxdisp.h>        // MFC Automation classes

Другие решения, меняющие настройки компоновщика, я их пробовал, но они не работали.
Я был бы признателен, если кто-то знает, почему мое решение работает, это странно, почему включение этих заголовков в pch.h решает проблему компоновщика, тогда как включение этих же заголовков в любом другом месте вызывает эту ошибку ??

0 голосов
/ 31 августа 2017

Для меня проблема была решена изменением

Проект -> Свойства -> Свойства конфигурации -> Общие: использование MFC = использовать MFC в общей библиотеке DLL

До того, как было установлено «Использовать стандартные библиотеки Windows»

Кроме того, мне пришлось установить параметр / MD в

Проект -> Свойства -> C / C ++ -> Генерация кода: библиотека времени выполнения = Многопоточная DLL (/ MD)

0 голосов
/ 05 июля 2017

Заголовочный файл объявлен и определен как переменная. Возможные решения включают в себя: Объявите переменную в .h: extern BOOL MyBool; а затем присвойте ему файл .c или .cpp: BOOL MyBool = FALSE ;. Объявите переменную static. Объявите переменную selectany.

https://msdn.microsoft.com/en-us/library/72zdcz6f.aspx

0 голосов
/ 15 августа 2015

Я также добавлю, что если вы заменили операторы new / delete (и если да, то укажите массив и скаляр), вам может понадобиться пометить их как __forceinline, чтобы объект не конфликтовал с Lib.

Например, я сделал это для принудительного выравнивания и у меня были те же проблемы, пока я не сделал это:

__forceinline void * operator new(size_t size)
{
    return _aligned_malloc(size, 16);
}
__forceinline void operator delete(void* ptr)
{
    _aligned_free(ptr);
}
__forceinline void * operator new [](size_t size)
{
    return _aligned_malloc(size, 16);
}
__forceinline void operator delete [](void* ptr)
{
    _aligned_free(ptr);
}
0 голосов
/ 10 мая 2013

У меня тоже была похожая проблема. Ссылка, данная Донни, объясняет причину. Решение состояло в том, чтобы просмотреть сообщения об ошибках, а затем удалить соответствующие библиотеки и добавить эти библиотеки сначала в порядке библиотек MFC, а затем библиотек CRT.

Способ сделать это в vs2008 дает Али.

0 голосов
/ 18 июля 2009

Проверьте файл манифеста обоих проектов, убедитесь, что они ссылаются на одну и ту же версию стандартной библиотеки. Скорее всего, это не так, проверьте свойства-> генерация кода-> ссылки на стандартную библиотеку.

...