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

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

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

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

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

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

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

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

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

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

  • Порядок инициализации статических переменных
  • Что такое Microsoft Visual Studio, эквивалентная опции GCC ld - whall-archive
  • Шаблон C ++, ссылка на ошибку
  • Почему при использовании шаблонов я получаю ошибки «неразрешенных внешних символов»?
  • Что означает «статически связанное» и «динамически связанное»?
  • ошибка LNK2038: обнаружено несоответствие для '_ITERATOR_DEBUG_LEVEL': значение '0' не соответствует значению '2' в main.obj
  • ошибка LNK2005: уже определена - C ++
  • Определение переменной в файлах заголовков
  • Давайте будем гением компьютера.