Когда мне нужно создать некоторую стороннюю библиотеку, которая будет использоваться в нескольких моих проектах под другой версией MSVC, я обычно строю ее для каждую версию MSVC и для как Конфигурации отладки и выпуска. Это то, что подталкивает, и это то, что мы сделали на протяжении всей нашей жизни в моей команде.Как правильно создать стороннюю библиотеку, которая будет использоваться в конфигурациях Debug и Release в моем проекте?
Однако, я до сих пор не понимаю, почему я не могу просто построить эту библиотеку, как ... что угодно. Все, что мне нужно - это прототип функции и объектный код, верно? Поскольку я привязываю CRT статически, у меня нет внешних зависимостей. Но когда я пытаюсь связать библиотеку, созданную в Release под MSVC8, с моим проектом в Debug под MSVC10, у меня есть такие досадные «уже определенные» ошибки компоновщика, которые мы все так ненавидим.
Но почему? Могу ли я просто «инкапсулировать» все эти функции внутри lib и не экспортировать их, чтобы мой проект использовал только то, что ему нужно из библиотеки lib? Почему у меня есть предварительно скомпилированная версия libpng и zlib, которую я могу связать в каждом проекте? Да, они не строятся с использованием MSVC, я думаю, но все еще используют те же функции CRT. Так может кто-нибудь объяснить подробно или поделиться ссылкой на некоторое просвещенное объяснение этой проблемы?
Хороший ответ! «... компоновщик склеивает CRT позже, когда библиотека связывается ...» - и есть ли способ заставить компоновщика связывать функции CRT в .lib? Я могу связать свой собственный код, почему я не могу заставить CRT связываться? – Mikhail
Это не то, как работают статические .libs. Это очень простой формат файла, просто коллекция файлов .obj. Вы вынуждаете компоновщик связывать ЭЛТ, создавая DLL. –