Ответ 1
Если другой проект (не статическая библиотека) является проектом CRT, проверьте эту ссылку:
У меня есть решение 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 файлов, будет высоко оценено.
Если другой проект (не статическая библиотека) является проектом CRT, проверьте эту ссылку:
В библиотеках 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).
Одна вещь, которую нужно попробовать - убедиться, что у вас есть:
#include "stdafx.h"
как первая строка в ваших .cpp файлах. Я уверен, что это не ответ во всех случаях, но он сделал идентичную ошибку в моем случае.
в входе компоновщика конфигурации
убедитесь, что у вас есть #include <afx.h>
в "stdafx.h"
ПЕРЕД другой, включая #include <string>
Убедитесь, что библиотека времени выполнения С++, с которой вы связываетесь, одинакова в вашей статической библиотеке, а также в вашем исполняемом файле. Проверьте свойства проекта C/С++ → Генерация кода- > настройки библиотеки времени выполнения.
опечатка. Один глупый способ, который вы получили, а не включать заголовок, вы inlucde cpp. например.
#include <myclass.cpp> //should be #include <myClass.h>
Я сталкиваюсь с этой проблемой в решении 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
в Игнорировать определенные библиотеки по умолчанию.Обратите внимание:
;
между двумя .lib
файлами.-d
должен быть добавлен в файлы в режиме отладки.Во-первых, libcmtd.lib предназначен для отладочной версии, а libcmt.lib - для производства. Дважды проверьте, что вы не включаете их обоих. Одно место для проверки - это раздел "Командная строка" свойств проекта Configuration/Linker.
Если вы перейдете к свойствам проекта и откройте раздел "Свойства конфигурации/компоновщик/вход", вы можете "Ингоровая конкретная библиотека"... попробуйте перечислить libcmtd.lib в этом поле.
Для меня у меня есть статическая библиотека, скомпилированная с помощью _CRTDBG_MAP_ALLOC, а приложение, не скомпилированное с помощью _CRTDBG_MAP_ALLOC, я получал тогда LNK2005. Я изменил приложение для компиляции с помощью _CRTDBG_MAP_ALLOC, и LNK2005 исчезнет.
Избавилась проблема
uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
uafxcw.lib
.uafxcw.lib
.Проверьте файл манифеста обоих проектов, убедитесь, что они связывают одну и ту же версию стандартной библиотеки. Скорее всего, это не так, проверьте привязку к стандартной библиотеке properties- > code generation- > .
У меня также была аналогичная проблема. Причина, поясняющая Донни, объясняет причину. Решение состояло в том, чтобы просмотреть сообщения об ошибках, а затем удалить эти задействованные библиотеки и добавить эти библиотеки в порядке очередей MFC, а затем CRT libs.
Способ сделать это в vs2008 дается ali.
Я также добавлю, что если вы заменили операторы 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);
}
Объявлен заголовочный файл и определен переменная. Возможные решения: Объявить переменную в .h: extern BOOL MyBool; а затем назначьте его в файл .c или .cpp: BOOL MyBool = FALSE;. Объявите переменную static. Объявите переменную selectany.
Для меня проблема была решена путем изменения
Проект → Свойства → Свойства конфигурации → Общие сведения: использование MFC = Использовать MFC в общей DLL
Прежде чем установить значение "Использовать стандартные библиотеки Windows"
Кроме того, мне пришлось установить опцию /MD в
Проект → Свойства → C/С++ → Генерация кода: Библиотека времени выполнения = Многопоточная DLL (/MD)
Я создал два свежих проекта с 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
Теперь одно из двух исправлений сработало для меня:
Project > Properties > Configuration Properties > General > Use of MFC
установите его для использования в Shared DLL, это также должно автоматически установить C/C++ > Code Generation > Runtime Library
на Multi-threaded debug dll/MDd
чтобы убедиться, что это действительно так тот. Попробуйте скомпилировать сейчас, у меня это сработало.#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