HomeBlogMagic

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;