Конкретные ошибки ссылок, о которых вы упоминали (с библиотеками LIBCMT (D) .lib, MSVCRT (D) .lib), связаны с конфликтами в параметрах генерации кода между модулями / библиотеками в вашей программе.
Когда вы компилируете модуль, компилятор автоматически вставляет в результирующий .obj некоторые ссылки на библиотеки времени выполнения (LIBCMT & MSVCRT). Теперь есть одна версия этих библиотек для каждого режима генерации кода (я имею в виду параметр в Свойствах конфигурации -> C / C ++ -> Генерация кода -> Библиотека времени выполнения). Таким образом, если у вас есть два модуля, скомпилированных с разным режимом, каждый из них будет ссылаться на свою версию библиотеки, компоновщик попытается включить оба, и, конечно, будут дублированные символы, поскольку по существу все символы одинаковы в этих библиотеках отличаются только их реализации.
Решение состоит из трех частей. Во-первых, убедитесь, что все модули в проекте используют один и тот же режим. Во-вторых, если у вас есть зависимости между проектами, все они должны использовать один и тот же режим. В-третьих, если вы используете сторонние библиотеки, вы должны либо знать, какой режим они используют (и принять его), либо иметь возможность перекомпилировать их в нужном режиме.
Последний самый сложный. Иногда библиотеки поставляются предварительно скомпилированными, и не всегда поставщик предоставляет информацию об используемом режиме. Хуже того, если вы используете более одной сторонней библиотеки, они могут иметь конфликтующие режимы. В этих случаях у вас нет лучшего варианта, чем метод проб и ошибок.
Также обратите внимание, что каждая версия Visual Studio имеет собственный набор библиотек времени выполнения, поэтому при использовании сторонних библиотек вы должны использовать библиотеки, скомпилированные с той же версией Visual Studio, которую вы используете. Если поставщик не предлагает его, ваш единственный выбор - перекомпилировать себя.