Используйте как статические, так и динамически подключаемые библиотеки в gcc.
Вопрос
Мне нужно распространить двоичный файл, который будет работать на как можно большем количестве дистрибутивов 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.Это должно делать свое дело.