Используйте как статические, так и динамически подключаемые библиотеки в gcc.

StackOverflow https://stackoverflow.com/questions/809794

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне нужно распространить двоичный файл, который будет работать на как можно большем количестве дистрибутивов Linux x86.Это означает, что мне придется статически связать некоторые библиотеки, например glibc, поскольку у пользователя может не быть той версии, которую я использую.Другие библиотеки, такие как Fontconfig, должны быть динамически связаны, поскольку они зависят от формата файла кэша и жестко запрограммированных местоположений, которые могут различаться в каждой системе.

Каковы параметры командной строки для этого?Если я укажу -static, то gcc вообще откажется динамически связывать какие-либо библиотеки.

Это было полезно?

Решение

Статическое связывание с любой системной библиотекой, особенно с libc, в современных системах UNIX или Linux двоичный файл значительно меньше портативный.Просто не делай этого.

Вместо этого используйте обратную совместимость (двоичные файлы, связанные со старой системой, продолжают работать во всех новых системах) в ваших интересах, либо путем связывания вашего двоичного файла со старой системой (я использую RedHat 6.2, и я не видел системы Linux, где мой двоичный файл не будет работать в течение последних 8 лет), или используя что-то вроде автоупаковка (который был удален после написания этого ответа).

Чтобы ответить на ваш первоначальный вопрос:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

заставит компоновщик использовать архивную версию libfoo.[Важно иметь конечный -Wl,-Bdynamic именно для того, чтобы вы не принудительно использовали статическую libc.]

Другие советы

Следует отметить, что в Linux вы можете (безопасно) статически связать библиотеку только в том случае, если ни одна из динамических библиотек не зависит от нее.Это означает, что если вы вообще используете какие-либо динамические библиотеки, вы можете забыть о статическом связывании libc.Просто используйте довольно старую версию для сборки в случае libc;libc на протяжении многих лет поддерживает строгую обратную совместимость ABI.

Попробуйте передать пути к файлам библиотеки, с которыми вы связываетесь, в командной строке компоновщика (будь то библиотеки .a или .so) и отбросьте -static.Это должно делать свое дело.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top