Используйте как статические, так и динамически связанные библиотеки в gcc
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.]
5 плюса
Следует отметить, что в Linux вы можете (безопасно) статически связать библиотеку только в том случае, если от нее не зависит ни одна из динамических библиотек. Это означает, что если вы вообще используете какие-либо динамические библиотеки, вы можете забыть о статической компоновке libc. Просто используйте довольно старую версию для сборки для случая libc; На протяжении многих лет libc поддерживает сильную обратную совместимость ABI.
Автор: bdonlan Размещён: 05.05.2009 02:323 плюса
Попробуйте передать пути к файлам библиотеки, с которыми вы ссылаетесь, в командной строке компоновщика (будь то библиотеки .a или .so) и drop -static. Это должно делать свое дело.
Автор: Mihai Limbășan Размещён: 01.05.2009 01:06Вопросы из категории :
- gcc Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC?
- gcc How to get rid of `deprecated conversion from string constant to ‘char*’` warnings in GCC?
- gcc How to automatically generate a stacktrace when my program crashes
- gcc Генерация зависимостей GCC для другого выходного каталога
- gcc Как имитировать ошибки выделения памяти
- gcc How do you get assembler output from C/C++ source in gcc?
- gcc Использование предварительно скомпилированных заголовков с CMake
- gcc ошибка «неверное использование неполного типа» с частичной специализацией шаблона
- gcc Использование библиотеки C ++ в коде C
- gcc Как заставить слабую связь работать с GCC?
- linker Почему фатальная ошибка «LNK1104: невозможно открыть файл« C: \ Program.obj »возникает при компиляции проекта C ++ в Visual Studio?
- linker Линкер не хватает памяти LNK1102
- linker Встраивание DLL в скомпилированный исполняемый файл
- linker g ++ неопределенная ссылка на typeinfo
- linker Расширение std :: list
- linker Используйте как статические, так и динамически связанные библиотеки в gcc
- linker Почему оптимизация компоновщика настолько бедна?
- linker Создание приложения Visual C ++, которое не использует функции CRT, все еще ссылается на некоторые