При компиляции моего проекта с включенным Address Sanitizer (/fsanitize=address
) это приводит к ошибке компоновщика
uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in clang_rt.asan_cxx-i386.lib(asan_new_delete.cc.obj)
uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in clang_rt.asan_cxx-i386.lib(asan_new_delete.cc.obj)
uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in clang_rt.asan_cxx-i386.lib(asan_new_delete.cc.obj)
uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in clang_rt.asan_cxx-i386.lib(asan_new_delete.cc.obj)
Я прочитал эту статью поддержки от Microsoft о похожей проблеме, но не смог решить мой с помощью него. Добавление uafxcw.lib
к игнорируемым библиотекам по умолчанию и повторное добавление его в качестве дополнительной зависимости не решает проблему. Очевидно, что полное игнорирование uafxcw.lib
приводит к отсутствию символов. Насколько я понимаю, мне нужны версии new
и delete
от clang_rt.asan_cxx-i386.lib
, иначе ASan не сможет обнаружить ошибки.
Я также не до конца понимаю, как определить проблемный модуль из вывод /verbose:lib
.
Как я могу исправить ошибку компоновщика?
# EDIT #
Он успешно связывается, если я переключаю свои проекты на используйте MF C из DLL вместо статического связывания.
Project Properties > Configuration Properties > Advanced > Use of MFC > Use MFC in a Shared DLL
и
Project Properties > C/C++ > Code Generation > Runtime Library > Multi-threaded DLL (/MD)
Однако это только Обходной путь не реальное решение.