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

  • Как удалить пакет из Laravel с помощью композитора?
  • Почему компиляторы настолько глупы?
  • Как C ++-связь работает на практике?
  • ошибка LNK2019: неразрешенный внешний символ _main, указанный в функции ___tmainCRTStartup
  • Почему фатальная ошибка «LNK1104: невозможно открыть файл« C: \ Program.obj »возникает при компиляции проекта C ++ в Visual Studio?
  • VA (виртуальный адрес) и RVA (относительный виртуальный адрес)
  • ошибка LNK2038: обнаружено несоответствие для '_ITERATOR_DEBUG_LEVEL': значение '0' не соответствует значению '2' в main.obj
  • Передача gcc непосредственно для связывания библиотеки статически
  • Interesting Posts
    Давайте будем гением компьютера.