Используйте как статические, так и динамически связанные библиотеки в gcc
Мне нужно распространить двоичный файл, который будет работать на как можно большем количестве дистрибутивов x86 Linux. Это означает, что мне приходится статически связывать некоторые библиотеки, например glibc, потому что у пользователя может не быть той версии, которую я использую. Другие библиотеки должны быть динамически связаны, например fontconfig, потому что они зависят от формата файла кэша и жестко закодированных мест, которые могут различаться в каждой системе.
Каковы параметры командной строки для этого? Если я укажу -статический, то gcc откажется от динамической связи любых библиотек вообще.
- Могу ли я смешивать статические и общедоступные библиотеки при связывании?
- Почему компиляторы настолько глупы?
- Что такое опция -fPIE для независимых по позиции исполняемых файлов в gcc и ld?
- Как C ++-связь работает на практике?
- Ошибки компоновщика при компиляции против glib ...?
- Как использовать OpenSSL в GCC?
- ошибка LNK2019: неразрешенный внешний символ _main, указанный в функции ___tmainCRTStartup
- VA (виртуальный адрес) и RVA (относительный виртуальный адрес)
- Как удалить пакет из Laravel с помощью композитора?
- Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC?
- Почему фатальная ошибка «LNK1104: невозможно открыть файл« C: \ Program.obj »возникает при компиляции проекта C ++ в Visual Studio?
- Как принудительно включить определение «неиспользуемых» объектов в библиотеке
- Передача 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. Это должно делать свое дело.