У меня возникло много концептуальных проблем с CRT от Microsoft. Для любого проекта вы должны скомпилировать все необходимые библиотеки для ссылки на ту же версию CRT.Как библиотека Linux CRunTime обрабатывается по сравнению с Microsoft
Первой проблемой является то, что ваш проект статически связан с CRT (/ MT). Затем все зависимые библиотеки также должны связывать свой собственный CRT статически. Поэтому каждая библиотека имеет свою собственную версию - например, - malloc(). Если вы скомпилировали одну из библиотек в прошлом году в системе A, эта версия CRT может отличаться от той, которую вы используете в другой системе B с пакетом обновления 3+. Поэтому, если вы освобождаете объекты, выделенные библиотекой, вы можете столкнуться с проблемами.
Так что это динамически связано. CRT - это путь (/ MD). С dll все библиотеки получат текущую реализацию ЭЛТ в системе. За исключением того, что с механизмом Microsoft Side by Side это не то, что происходит. Вместо этого вы получаете версию CRT, помеченную в библиотеке, которую вы скомпилировали, и эта версия DLL поставляется в эту библиотеку. Так может возникнуть одна и та же проблема, которую я описал ранее. Вы собираете библиотеку в системе A год назад против одного ЭЛТ. Год спустя появилась новая версия с обновлением. Ваша основная программа получает DLL с одной версией CRT, библиотека получает DLL с другой версией CRT, такая же проблема может возникнуть.
Так что вы делаете? Я понимаю, что распределение памяти между библиотеками неодобрительно. Но вы можете игнорировать пример malloc и придумать еще один. У вас есть каждый разработчик перекомпилировать каждую зависимую библиотеку на своей машине, чтобы убедиться, что все использует один и тот же CRT? Затем для выпуска вы снова перекомпилируете каждую библиотеку?
Как это работает в Linux? Это мой главный интерес. Есть ли CRT, поставляемый с GCC, или сама система Linux поставляется с библиотеками CRT? Я никогда не видел, чтобы CRT явно связывался с Makefile.
В Linux, с чем связаны ссылки на динамические библиотеки CRT? Самый последний на машине, или это более «бок о бок» механизм.
Насколько я знаю, обычно нет проблем с перестройкой всех проектов и зависимостей в Linux, поскольку код часто доступен. – Lol4t0
glibc (реализация GNU библиотеки C, которая охватывает несколько расширений ISO C + POSIX +) использует символы с версией для обработки совместимости между версиями. Практически каждый другой автор библиотеки не заботится о такой совместимости между версиями, так как в любом случае большинство программ Linux распространено как источник и может быть перекомпилировано по желанию (либо дистрибутивами, либо даже конечным пользователем). – ninjalj
Ну, технически проблема с разными частями кода, вызывающими другую версию samefunc @@, также может возникать в Linux из-за упомянутых версий символов. Однако, в отличие от msvcrt, glibc по-прежнему имеет только один символ malloc на сегодняшний день (malloc @@ GLIBC_2.2.5).Я также не понимаю, зачем это понадобилось бы больше, ведь ABI компании malloc не изменилась с ANSI C, и вряд ли это произойдет в ближайшее время. –