Подтвердить что ты не робот

Ошибка LNK2005: новое и удаление уже определено в LIBCMTD.lib(new.obj)

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

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

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

4b9b3361

Ответ 1

Если другой проект (не статическая библиотека) является проектом CRT, проверьте эту ссылку:

http://support.microsoft.com/kb/148652

Ответ 2

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

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

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

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

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

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

Ответ 3

Одна вещь, которую нужно попробовать - убедиться, что у вас есть:

#include "stdafx.h"

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

Ответ 4

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

  • В дополнительных зависимостях поставьте uafxcw.lib; LIBCMT.lib
  • В игнорировать определенный put put uafxcw.lib; LIBCMT.lib

Ответ 5

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

Ответ 6

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

Ответ 7

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

#include <myclass.cpp> //should be #include <myClass.h>

Ответ 8

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

Я решаю проблему следующими способами: сначала найдите " Проект" → "Свойства" → "Свойства конфигурации" → "Линкер" → "Enter".

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

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

В режиме релиза:

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

Обратите внимание:

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

Ответ 9

Во-первых, libcmtd.lib предназначен для отладочной версии, а libcmt.lib - для производства. Дважды проверьте, что вы не включаете их обоих. Одно место для проверки - это раздел "Командная строка" свойств проекта Configuration/Linker.

Если вы перейдете к свойствам проекта и откройте раздел "Свойства конфигурации/компоновщик/вход", вы можете "Ингоровая конкретная библиотека"... попробуйте перечислить libcmtd.lib в этом поле.

Ответ 10

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

Ответ 11

Избавилась проблема

uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
  • В дополнительных зависимостях поставьте uafxcw.lib.
  • В игнорировать определенный put put uafxcw.lib.

Ответ 12

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

Ответ 13

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

Способ сделать это в vs2008 дается ali.

Ответ 14

Я также добавлю, что если вы заменили операторы new/delete (и если да, то сделайте массив и скалярные оба), вам может потребоваться пометить их как __forceinline, чтобы obj не сталкивался с 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);
}

Ответ 15

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

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

Ответ 16

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

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

Прежде чем установить значение "Использовать стандартные библиотеки Windows"

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

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

Ответ 17

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

#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 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