Полностью статически построить приложение со всеми зависимостями (libgcc и т. Д.)?

Я сейчас пытаюсь скомпилировать все мои приложения в виде статической библиотеки. Моя мотивация:

  1. Не полагаться на какие-либо библиотеки, предоставляемые ОС, чтобы иметь идеально воспроизводимую кодовую базу
  2. Избегайте проблем при развертывании на других системах, вызванных динамическим связыванием
  3. Избегайте столкновений во время выполнения при связывании с различными версиями библиотеки
  4. Возможность кросс-компиляции для других ОС

Однако, как я изначально боялся, мне пришлось довольно быстро спуститься в кроличью нору. В настоящее время я застрял с OpenCV, и я уверен, что это еще не все. Тем не мение, мои основные вопросы являются:

  1. Можно ли создать полностью статически построенное приложение (например, libc, ligcc и т. Д.?)
  2. Можно ли статически связать все библиотеки, но динамически связать основные компоненты (libgcc и т. Д.)?
  3. Если нет, возможно ли связать статически созданные библиотеки (например, OpenCV), но удовлетворить их зависимости путем динамического связывания (zlib, libc и т. Д.)?
  4. Я проводил исследования в Интернете, но не смог найти исчерпывающего руководства, в котором рассказывается о внутренних связях (статические и динамические). Знаете ли вы о хорошей книге / учебнике? Книга о gcc поможет мне?
  5. Это очень глупая идея?

2

Решение

Моя мотивация:

  1. Не полагаться на какие-либо библиотеки, предоставляемые ОС, чтобы иметь идеально воспроизводимую кодовую базу

  2. Избегайте проблем при развертывании на других системах, вызванных динамическим связыванием

  3. Избегайте столкновений во время выполнения при связывании с различными версиями библиотеки

  4. Возможность кросс-компиляции для других ОС

Ваши мотивы все не так.

Для # 1 вам не нужен полностью статический двоичный файл. Вам просто нужно связать с набором контролируемых версиями библиотек, используя --sysroot средство предоставлено линкерами GNU

Для # 2, ваша мотивация ошибочна.

В Linux полностью статический двоичный файл может таинственным образом зависать, если libc, установленный в целевой системе, отличается от (static) libc, на котором была построена программа. То есть полностью статический двоичный файл в Linux является (вопреки распространенному мнению) значительно Меньше портативный, чем динамически связанный. Надо просто никогда статически ссылка libc.a на Linux.

Одно это должно заставить вас отказаться от этого подхода (по крайней мере, для любых систем на основе GLIBC).

Для # 3, не связывайтесь с разными версиями библиотеки (во время сборки программы), и никаких столкновений не будет.

Для # 4 то же самое решение, что и для # 1, просто работает.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]