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

gcc linker

25773 просмотра

3 ответа

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

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

Автор: Steve Hanov Источник Размещён: 12.11.2019 09:27

Ответы (3)


79 плюса

Решение

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

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

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

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

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

Автор: Employed Russian Размещён: 03.05.2009 02:28

5 плюса

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

Автор: bdonlan Размещён: 05.05.2009 02:32

3 плюса

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

Автор: Mihai Limbășan Размещён: 01.05.2009 01:06
Вопросы из категории :
32x32