2017-01-20 3 views
0

Я пытаюсь написать слой взаимодействия CLI между существующей кодовой базой C++ и приложением C# wpf. Мои библиотеки C++ уже перегружают глобальные новые и удаляются, чтобы реализовать мое собственное отслеживание памяти и другие тонкости. Таким образом, зависимости выглядеть примерно так:Конфликтные перегрузки глобального удаления

(Native библиотека скомпилированной к статическому ОМТУ) -> (CLI слой) -> (C# WPF приложение)

Однако всякий раз, когда я включаю свои собственные библиотеки и попытаться построить мой проект CLI, я бегу в противоречивой символ глобального удалять который был уже определен в msvcrtd:

LNK2005 Ошибка "аннулируются оператор __cdecl удалить (аннулируются *)" (?? 3 @ YAXPAX @ Z) уже определены в msvcrtd .lib (delete_scalar.obj)

Я не уверен, как заставить мою сборку взять мое глобальное удаление вместо того, что было в библиотеке по умолчанию. Я попытался сделать еще один чистый родной проект, который компилирует DLL и компилирует все мои статические библиотеки в это, а затем накладывает слой взаимодействия на эту DLL. Это работает, но я бы предпочел не иметь 2 слоя клея вместо одного.

Я использую Visual Studio 2015.

+1

Отслеживание памяти приятно, но не перегружает глобальное новое и удаляет простой хак? – Steeve

+0

Вы пытались настроить небольшой тестовый пример, чтобы воспроизвести эту проблему? Одна мысль состоит в том, что у вас разные настройки для библиотеки C++; особенно со статической связью. –

ответ

0

Уроженец компонент использует CRT как DLL? Это требование при использовании смешанных сборок. Если вы статически связанная библиотека использует статический CRT, вы попадаете в неприятности.

Проверить и связать флаг/VERBOSE, чтобы увидеть, откуда это происходит. Устраните этот другой вызов библиотеки.