2012-04-12 1 views
3

У меня возникло много концептуальных проблем с 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? Самый последний на машине, или это более «бок о бок» механизм.

+0

Насколько я знаю, обычно нет проблем с перестройкой всех проектов и зависимостей в Linux, поскольку код часто доступен. – Lol4t0

+0

glibc (реализация GNU библиотеки C, которая охватывает несколько расширений ISO C + POSIX +) использует символы с версией для обработки совместимости между версиями. Практически каждый другой автор библиотеки не заботится о такой совместимости между версиями, так как в любом случае большинство программ Linux распространено как источник и может быть перекомпилировано по желанию (либо дистрибутивами, либо даже конечным пользователем). – ninjalj

+0

Ну, технически проблема с разными частями кода, вызывающими другую версию samefunc @@, также может возникать в Linux из-за упомянутых версий символов. Однако, в отличие от msvcrt, glibc по-прежнему имеет только один символ malloc на сегодняшний день (malloc @@ GLIBC_2.2.5).Я также не понимаю, зачем это понадобилось бы больше, ведь ABI компании malloc не изменилась с ANSI C, и вряд ли это произойдет в ближайшее время. –

ответ

2

На стороне Linux я думаю, что есть две основные части стандартной библиотеки, которые находятся под вопросом: у нас есть часть C-runtime, которая в значительной степени должна быть совместима с ABI навсегда. Эффективно независимо от того, какие ссылки на ссылки в конечной ссылке время должно быть хорошо, и вы можете перераспределить любую необходимую общую библиотеку с вашим двоичным, если это более старая версия, необходимая для совместимости. Обычно библиотеки просто сидят бок о бок на * NIX-системах.

Во-вторых, у вас есть библиотеки C++. Они почти гарантированно не совместимы с ABI, поэтому вы должны обязать перестроить каждый компонент финального двоичного файла в той же версии библиотеки C++. К сожалению, этого не существует, потому что иначе вы можете столкнуться с различными несоответствиями. Вот почему многие библиотеки с открытым исходным кодом даже не беспокоятся о готовых библиотечных двоичных файлах: каждый должен создать свою собственную копию, чтобы убедиться, что она будет правильно связываться с их окончательным кодом приложения.

+0

Я думаю об упрощении ситуации с Linux. Кроме того, программы не связаны с конкретной версией основного макроса libc (версия исправления не используется для поддержки обновлений, не изменяющих ABI)? Дело в том, что гораздо больше программного обеспечения построено из исходного кода на платформах Linux. Кроме того, правильные загрузки библиотеки обрабатываются менеджерами пакетов. –

+0

Являются ли библиотеки CRT и C++ STD динамически связанными? Если «crt.so» связан, будет ли только тот, который находится на пути, или существует такой механизм, как в Windows, где Windows DLL Loader просматривает манифест для версии CRT и извлекает DLL из Windows \ WinSxS? – Budric

+0

Библиотеки не всегда динамически связаны, хотя в * NIX это довольно популярно. Он связывает что-то вроде 'libc.so.1', где он имеет версию, на которой он установлен, поэтому он знает, какой' .so' загружать во время выполнения (хотя совместимые патчи разрешены). –