Solve: uafxcw.lib(afxmem.obj) : error LNK2005
In letzter Zeit trat bei mir öfter folgender Fehler auf:
uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
Dabei wird die MFC Bibliothek (uafxcw) vor der C Runtime (libcpmt) gelinkt.
Da beide Bibliotheken eigene Implementierungen für new, delete, etc haben, kollidieren Sie beim Link-Prozess.
CMAKE
In cmake kann der Fehler so behoben werden:
set ( CompilerFlags
CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS_DEBUG
CMAKE_EXE_LINKER_FLAGS_RELEASE
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
)
foreach(CompilerFlag ${CompilerFlags})
# afxcwd.lib libcpmtd.lib must be set in right order
if(${CompilerFlag} MATCHES "DEBUG")
set(${CompilerFlag} "${${CompilerFlag}} uafxcwd.lib libcpmtd.lib")
else()
set(${CompilerFlag} "${${CompilerFlag}} uafxcw.lib libcpmt.lib")
endif()
endforeach()
Es gibt auch ein Makro (CcLoadGuiSettings) dafür in meinem Framework dazu: GitHub
CMAKE neuere einfachere Version je Target
target_link_libraries(
${PROJECT_NAME} PUBLIC
uafxcw$<$<CONFIG:Debug>:d>.lib libcpmt$<$<CONFIG:Debug>:d>.lib
)
Visual Studio
In Visual Studio muss dafür sorge getragen werden dass in den jeweiligen Projekteinstellungen die Bibliotheken in der gleichen Reihenfolge geladen werden.
Dazu in folgende Einstellungen wechseln:
- Project Properties->Configuration Properties->Linker->Input
Dann werden zu den Additional Dependencies folgende Bibliotheken vorne hinzugefügt afxcwd.lib;libcpmtd.lib;