ошибка 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 ]

62 голосов
/ 16 ноября 2009

Библиотеки CRT используют слабую внешнюю связь для функций new, delete и DllMain. Библиотеки MFC также содержат функции new, delete и DllMain. Эти функции требуют, чтобы библиотеки MFC были связаны прежде, чем библиотека CRT будет связана. http://support.microsoft.com/kb/148652

Решение на основе VS2005 (замените Nafxcwd.lib на Uafxcwd.lib для ~ VS2013)

перейдите в проект> свойства> свойства конфигурации> компоновщик> input

добавить в "Дополнительные зависимости" -> Nafxcwd.lib Libcmtd.lib

добавить в "игнорировать определенную библиотеку" -> Nafxcwd.lib; Libcmtd.lib

порядок библиотек важен (Nafxcwd.lib; Libcmtd.lib).

10 голосов
/ 06 октября 2011

Нужно убедиться, что у вас есть:

#include "stdafx.h"

как первая строка в ваших .cpp файлах. Я уверен, что это не ответ во всех случаях, но в моем случае ошибка исчезла.

5 голосов
/ 20 июня 2017

убедитесь, что у вас есть #include <afx.h> в "stdafx.h" ДО других включений, таких как #include <string>

5 голосов
/ 18 марта 2014

в конфигурационном компоновщике

  • В дополнительные зависимости положите uafxcw.lib; LIBCMT.lib
  • В Игнорировать конкретный пут положить uafxcw.lib; LIBCMT.lib
3 голосов
/ 09 ноября 2018

Я сталкиваюсь с этой проблемой в решении MFC Visual Studio 2010 при изменении Use MFC in a Shared DLL на Use MFC in a Static Library в Проект -> Свойства -> Свойства конфигурации -> Общие .

Я решаю проблему следующими способами, пожалуйста, найдите Проект -> Свойства -> Свойства конфигурации -> Компоновщик -> Ввод сначала.

В режиме отладки:

  • Добавить uafxcwd.lib;Libcmtd.lib в Дополнительные зависимости .
  • Добавить uafxcwd.lib;Libcmtd.lib в Игнорировать определенные библиотеки по умолчанию .

В режиме разблокировки:

  • Добавить uafxcw.lib;Libcmt.lib в Дополнительные зависимости .
  • Добавить uafxcw.lib;Libcmt.lib в Игнорировать определенные библиотеки по умолчанию .

Примечание:

  1. Не пропустите ; между двумя .lib файлами.
  2. В файлы в режиме отладки необходимо добавить суффикс -d.
2 голосов
/ 27 апреля 2012

опечатка. Один глупый способ, который вы получили - вместо того, чтобы включать заголовок, вы включаете cpp. например,

#include <myclass.cpp> //should be #include <myClass.h>
2 голосов
/ 18 июля 2009

Убедитесь, что библиотека времени выполнения C ++, с которой вы связываетесь, одинакова как в вашей статической библиотеке, так и в вашем исполняемом файле. Проверьте свойства вашего проекта C / C ++ -> Генерация кода-> Настройки библиотеки времени выполнения.

1 голос
/ 07 апреля 2017

избавился от проблемы

uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
  • В дополнительные зависимости ставим uafxcw.lib.
  • В Игнорировать конкретный пут положить uafxcw.lib.
1 голос
/ 03 марта 2015

Для меня у меня есть статическая библиотека, скомпилированная с _CRTDBG_MAP_ALLOC, и приложение, не скомпилированное с _CRTDBG_MAP_ALLOC, я получал LNK2005.Я изменил приложение для компиляции с _CRTDBG_MAP_ALLOC, и LNK2005 исчезает.

1 голос
/ 18 июля 2009

Во-первых, libcmtd.lib для отладочной версии, а libcmt.lib для производства. Дважды проверьте, что вы не включаете оба. Одно из мест для проверки - раздел «Командная строка» свойств проекта «Свойства конфигурации / компоновщик».

Если вы перейдете к свойствам проекта и откроете раздел «Свойства конфигурации / Компоновщик / Вход», вы можете «Определить библиотеку Ingore» ... попробуйте указать libcmtd.lib в этом поле.

...