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

gcc linker

25773 просмотра

3 ответа

6069 Репутация автора

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

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

Автор: Steve Hanov Источник Размещён: 01.05.2009 12:56

Ответы (3)


3 плюса

50063 Репутация автора

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

Автор: Mihai Limbășan Размещён: 01.05.2009 01:06

79 плюса

136734 Репутация автора

Решение

Статическое связывание с любой системной библиотекой, особенно с 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 плюса

185598 Репутация автора

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

Автор: bdonlan Размещён: 05.05.2009 02:32
Вопросы из категории :
32x32