Ошибка LNK2005 возникает, когда библиотека CRT и библиотеки MFC связаны в неправильном порядке в Visual C++

Переводы статьи Переводы статьи
Код статьи: 148652 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

Если в неправильном порядке связанные библиотеки времени выполнения C (CRT) и библиотеки Microsoft Foundation Class (MFC), может появиться следующие сообщения об ошибках LNK2005:
NAFXCWD.lib(afxmem.obj): ошибка LNK2005:
"void * __cdecl оператор new (unsigned int)" (ГК2@YAPAXI@Z) уже
в LIBCMTD.lib(new.obj)
NAFXCWD.lib(afxmem.obj): ошибка LNK2005:
«void __cdecl оператор delete(void *)» (ГК3@YAXPAX@Z) уже определен
в LIBCMTD.lib(dbgnew.obj)
NAFXCWD.lib(afxmem.obj): ошибка LNK2005:
"void * __cdecl оператор new (char const int, unsigned int *, int)"
(??2@YAPAXIHPBDH@Z) уже определены в LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): ошибка LNK2005: уже определено в _DllMain@12
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): ошибка LNK2005: уже определено в _DllMain@12
MSVCRTD.lib(DllMain.obj)

Причина

Библиотеки CRT слабой внешней компоновки использовать новые, Удалитьи функции DllMain . Библиотеки MFC также содержат новые, Удалитьи функции DllMain . Эти функции требуется связать перед связанные библиотеки CRT библиотеки MFC.

Решение

Существует два способа решения этой проблемы. Первое решение заключается в последующей компоновщику связаться библиотек в правильном порядке. Второе решение позволяет найти модуль, который вызывает проблему и исправить ее.

Примечание Следующие действия относятся к Visual C++ 6.0.

Способ первый. Настройка компоновщика на принудительную компоновку библиотек в правильном порядке

  1. В меню проектнажмите кнопку Параметры.
  2. В Параметры для представления диалогового окна «Параметры проекта » выберите вариант конфигурации проекта, является получение ошибки связи.
  3. На вкладке « ссылки » щелкните Вводв поле Категория .
  4. В поле Ignorelibraries вставьте имена библиотек (forexample, Nafxcwd.lib;Библиотеки LIBCMTD.lib).

    Примечание Эквивалент для командной строки компоновщика в /NOD:<library name=""></library>.
  5. В окне модули объектов/библиотек вставьте имена библиотек. Необходимо убедиться, что они перечислены в двух библиотек andas первого заказа в строке (например, Nafxcwd.libLibcmtd.lib).
Чтобы установить этот параметр в Visual C++ .NET, чтение раздела интерактивной справки «Параметр свойствам проекта».

Способ второй. Поиск и исправление проблемного модуля

Чтобы просмотреть текущий порядок ссылок библиотеки, выполните следующие действия.
  1. В меню проектнажмите кнопку Параметры.
  2. В параметров для вид диалогового окнаПараметры проекта , установите конфигурации проекта, является получение ошибки связи.
  3. На вкладке ссылки введите/ verbose: lib в окне Параметры проекта.
  4. Заново постройте проект. В процессе компоновки библиотеки будут перечислены в окне theoutput.

Статус

Данное поведение является нормальным.

Дополнительная информация

При использовании библиотеки MFC, необходимо убедиться, что они связаны перед связанные библиотеки CRT. Это можно сделать, убедитесь, что каждый файл проекта включает Msdev\Mfc\Include\Afx.h, либо напрямую (#include <Afx.h>) или косвенно (#include <Stdafx.h>). Afx.h включить файл силы правильный порядок библиотеки с помощью #pragma comment (lib,"<libname>") директива.<b00> </b00> </libname> </Stdafx.h> </Afx.h>

Если исходный файл имеет расширение .c, или файл с расширением CPP, но не использует MFC, можно создать и включить файл малого заголовка (Forcelib.h) в верхней части модуля. Этот новый заголовок гарантирует правильность порядка поиска thelibrary.

Visual C++ не содержит этот файл заголовка. Чтобы создать этот файл, выполните следующие действия.
  1. Откройте Msdev\Mfc\Include\Afx.h.
  2. Выберите строки между #ifndef _AFX_NOFORCE_LIBS и #endif / /! _AFX_NOFORCE_LIBS.
  3. Копирование выделенного фрагмента в буфер обмена Windows.
  4. Создайте новый текстовый файл.
  5. Вставьте содержимое буфера обмена в новый файл.
  6. Сохраните файл с именем Msdev\Mfc\Include\Forcelib.h.

Действия по воспроизведению проблемы в Visual C++ .NET

  1. Запустите Microsoft Visual Studio .NET.
  2. В меню файл выберите пунктСоздатьи выберите команду проект.
  3. Типы проектоввыберите вариант Проекты Visual C++ , а в области Шаблонывыберите Приложение MFC.
  4. В поле имя введитеQ148652.
  5. В поле расположение введитеC:\test, а затем нажмите кнопку ОК.
  6. В диалоговом окне Мастер приложений MFC выберите Тип приложения.
  7. Выберите в полеТип приложенияна базе диалогового окна и нажмите кнопку Использовать MFC в staticlibrary под Использование MFC.
  8. Нажмите кнопку Готово.
  9. В обозревателе решений в разделе Исходные файлывыберите трех файлов .cpp.
  10. Щелкните правой кнопкой мыши трех выбранных файлов и нажмите кнопкуУдалить.
  11. Щелкните файлыправой кнопкой мыши, выберите командуДобавитьи нажмите кнопку добавить новый элемент.
  12. В группеШаблоныщелкните файлы C++ . В поле имя введитеAA. Нажмите кнопку Открыть.
  13. Вставьте следующий код в файл Aa.cpp:
    int test(){new int; return 1;}
  14. Щелкните Файлыправой кнопкой мыши, выберите пунктДобавитьи выберите команду Добавить существующий элемент.
  15. Выберите следующие файлы:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. Нажмите кнопку Открыть.
  17. Файлы, выбранные на шаге 15 появятся подИсходных файлов.
  18. Выделите все четыре файла .cpp под SourceFiles.
  19. Щелкните правой кнопкой мыши четыре выбранные файлы .cpp и thenclick Свойства.
  20. Разверните папку Свойства конфигурациии thenexpand C/C++.
  21. Нажмите кнопку Предкомпилированные заголовки.
  22. Присвойте свойству Создавать или использовать предкомпилированный заголовокзначение Не использовать предкомпилированный заголовок. Нажмите кнопкуОК.
  23. В меню Построение выберите команду RebuildSolution.

Свойства

Код статьи: 148652 - Последний отзыв: 23 ноября 2013 г. - Revision: 11.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Ключевые слова: 
kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb kbmt KB148652 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 148652

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com