Linux для статической сборки

Содержание
  1. Статическая сборка программ
  2. Re: Статическая сборка программ
  3. Re: Статическая сборка программ
  4. Re: Статическая сборка программ
  5. Re: Статическая сборка программ
  6. Re: Статическая сборка программ
  7. Re: Статическая сборка программ
  8. Re: Статическая сборка программ
  9. Re: Статическая сборка программ
  10. Re: Статическая сборка программ
  11. Re: Статическая сборка программ
  12. Re: Статическая сборка программ
  13. Кросс-компиляция Qt5 под Linux для Win x32/x64/static/shared
  14. 0. Сценарий сборки
  15. 1. Предварительная подготовка
  16. 2. Установка среды кросс-компиляции MXE
  17. Русские Блоги
  18. Компиляция gcc, создание статической библиотеки и динамической библиотеки в Linux
  19. Компиляция, статическая библиотека, динамическая библиотека gcc в Linux
  20. 1 процесс компиляции gcc
  21. 1.1 Процесс компиляции gcc
  22. 1.2 Общие параметры gcc
  23. 2 Создание статической библиотеки gcc
  24. 2.1 Процесс создания статической библиотеки
  25. 2.2 Преимущества и недостатки статических библиотек
  26. 3 Производство динамической библиотеки / разделяемой библиотеки gcc
  27. 3.1 Процесс создания динамической библиотеки / разделяемой библиотеки
  28. 3.2 Динамическая библиотека не может найти решение
  29. 3.3 Преимущества и недостатки динамических библиотек

Статическая сборка программ

Re: Статическая сборка программ

И что Вас напрягает?

Re: Статическая сборка программ

Не знаю про Qt4, но с Qt3 мне этого сделать не удавалось. Со вторыми получалось.

Re: Статическая сборка программ

Re: Статическая сборка программ

Никто не просит таскать бинари между дистрибутивами.

А таскаешь — таскай вместе с динамическими библиотеками, никто не мешает.

Re: Статическая сборка программ

Re: Статическая сборка программ

2Krivenok_Dmitry (10.01.2006 15:58:53):

> Универсального решения нет! Только система подпорок, которые работают лишь в определённых случаях.

Ну, я девелоплю некую систему, и пока не сталкивался с I32 ELF Линуксами, на которых моя система (несколько статически слинкованных прог) не работала бы. Вернее, иногда сталкиваюсь и сразу подправляю.

Одна проблема — с nsswitch — решается «перепропиской» переменной DISPLAY в стартовых скриптах с символического имени на IP.

Но проблема, действительно, трудноразрешимая.

Re: Статическая сборка программ

В чём проблема? Дописываешь к флагам компилятора -Wl,—all-static и всё

Re: Статическая сборка программ

Это же Linux 🙂 В общем случае ни о какой портабельности между дистрибами речи быть не может. Некоторые библиотеки просто нельзя залинковать статически (тот же libpthread.so и libdl.so).

Кроме того, как ты можешь заметить, в путях много X-овых библиотек. Поскольку они являются «системными», то, пожалуй, линковать их статически тоже в принципе было бы опасно.

Саму QT library вроде бы можно собрать как архив .a.

Re: Статическая сборка программ

Re: Статическая сборка программ

Если для тебя скрипт для запуска с LD_LIBRARY_PATH — сложен, то твоя софтина и подавно никому не нужна, ничего ценного ты не напишешь.

А вот за статическую линковку GPL и LGPL библиотек в коммерческую закрытую дрянь тебе хайло быстро начистят, и правильно сделают.

Re: Статическая сборка программ

Вот как раз X линковать можно как угодно, протокол очень стабильный.

Источник

Кросс-компиляция Qt5 под Linux для Win x32/x64/static/shared

Документирование получения системы кросс-компиляции под Linux для Windows x32/x64/static/shared и сборка последней на момент описания Qt 5.4.1 в лайт-версии (для указанных четырех целей). Для себя, глубоко-обожаемого, ну и для пользы обществу.

Многие разработчики приходят к выводу, что использование *nix (в частности Linux) более предпочтительно для разработки приложений, используя фрэймворк Qt. И тому есть причины. Qt изначально ориентирована на *nix инструментарий, типа autotool, make, perl… И второй момент, под никсами есть прекрасный инструмент — valgrind, под виндой порта пока его не видел. Ну и последняя причина: просто удобно иметь набор инструментария для создания приложений под различные целевые платформы — в одном месте.

0. Сценарий сборки

Все шаги делаем последовательно. Желательно не объединять все скрипты в последовательную сборку по причине необходимости промежуточного «человечного» контроля. Разные дистрибутивы Линуха, разные среды исполнения, наборы инструментариев… Простой алгоритм: сделал очередной шаг, убедился в отсутствии ошибок, пошел делать следующий. Итак, сам сценарий:

  • 1. Предварительная подготовка
  • 2. Установка среды кросс-компиляции MXE
  • 3. Загрузка и настройка Qt 5.4.1
  • 4. Сборка комплектов Qt 5.4.1 для четырех целей (см. сабж)
  • 5. Прописка собранного в QtCreator

1. Предварительная подготовка

У вас установлен дистрибутив Линукса. Желательно все это делать на на продакшен-компе (не на живом Линуксе), а установленном в виртуальную машину. Я например, пользуюсь VMWare, но это дело вкуса. Выбор дистрибутива Линукса — так же дело вкуса. Лично я предпочитаю Gentoo Linux, собственно под ним всю эту кухню и настраиваю. Если есть сложности в настройке, у меня есть небольшая статейка по этому вопросу: «Установка и настройка Linux Gentoo под VMWare».

Итак, у вас есть настроенный Линукс и вы работаете не под рутом! Для дальнейшей работы вам нужно проверить присутствие следующих установленных пакетов, или доустановить:

Вся дальнейшая установка будет производиться в каталог $HOME/dev. Если у вас таковой присутствует — либо переименовываете его, либо внимательно правите скрипты, которые будут приведены далее. Для всех манипуляций со скачиваемыми внешними файлами/скриптами/библиотеками будет использован каталог $HOME/setup. Все замечания выше относительно $HOME/dev — в силе и к этому каталогу.

2. Установка среды кросс-компиляции MXE

Предварительное замечание об MXE. Это отличнейшая система сборки тулчейнов для кросс-компиляции. Но есть одно «но». В данный момент не существует стабильной ветки. Авторы до поры до времени вели две ветки в своем git-репозитарии — стабильную и «разработческую». Сейчас ветки объединены. Разработка идет ну очень активно — изменения сбрасываются чуть ли не раз 1-3 дня. А это чревато тем, что «то работает сборка, то не работает». Некоторые важные для меня библиотеки, в частности клиентская часть PostgreSQL, собираются без ошибок, но в нерабочем состоянии. Потратил неделю не исследование явных косяков. Исправляем эти «недочеты». Итак:

Должны получить в каталоге $HOME/setup следующий набор скриптов:

Источник

Русские Блоги

Компиляция gcc, создание статической библиотеки и динамической библиотеки в Linux

Приглашаем всех обратить внимание на автора, ваше внимание — самая большая мотивация для меня продолжать совершенствоваться.

Компиляция, статическая библиотека, динамическая библиотека gcc в Linux

gcc — это текстовый компилятор, который представляет собой инструмент для компиляции кода.Следующее описывает процесс компиляции языка C gcc (файл .c).

1 процесс компиляции gcc

1.1 Процесс компиляции gcc

Компиляция gcc делится на следующие четыре этапа:

  • препроцессор gcc: положить .c файл Скомпилирован в Предварительная обработка из .i файл
  • компилятор gcc: положить Предварительная обработка из .i файл Скомпилирован в .s Файл сборки
  • ассемблер gcc: положить .s из Файл сборки Скомпилирован в .o из двоичный файл
  • компоновщик gcc: положить .o из двоичный файл Ссылка на исполняемый файл
Читайте также:  Как обновить mac os mavericks до big sur

Четыре этапа компиляции команд:

  • Предварительная обработка: gcc -E hello.c -o hello.i
  • Скомпилировать: gcc -S hello.i -o hello.s
  • компиляция: gcc -c hello.s -o hello.o
  • связь: gcc hello.o -o hello

Вышеупомянутые четыре процесса также могут быть использованы Команда Выполнить, напрямую сгенерировать Исполняемый документ:

Примечание:

1. Можно использовать параметры памяти. ESc , -o Параметр — это имя указанного выходного файла.
2. Под окнами, если gcc hello.c , По умолчанию создается исполняемый файл. a.exe ;в случае gcc hello.c -o myapp , Непосредственно сгенерирует исполняемый файл myapp.exe , Добавляйте суффикс автоматически.
3. На втором этапе поместите Предварительная обработка из .i файл Скомпилирован в .s из Файл сборки наиболее тратить время 。
4. Даже если исполняемый файл создается напрямую, он был Предварительная обработка 、 Компилировать 、 сборник 、 связь Эти процессы просто не генерировали промежуточные файлы.

Конкретные функции четырех этапов:

Предварительная обработка: 1) положить .c В файле Расширение файла заголовка добавить в .i Предварительно обработать начало файла; 2) затем поставить .c Код файла добавлен в .i После содержимого заголовочного файла; 3) поставить Определение макроса Замените значение на конкретное значение, Удалите комментарии в исходном коде 。

Скомпилировать: поместить файл c перевод сделать Файл сборки , Это преобразование двух грамматик программы.

Компиляция: положить Файл сборки Программирование Двоичный Файл, файл на данный момент не имеет определенного содержимого.

Ссылка: объедините соответствующий код из библиотеки функций в целевой файл.

1.2 Общие параметры gcc

Следующие конкретные примеры:

1. Исполняемый файл и файл заголовка находятся на одном уровне.

1. Создайте один sum.c Содержимое файла выглядит следующим образом:

2. Создается на том же уровне, что и sum.c. head.h Заголовочный файл выглядит следующим образом:

Иерархическая структура двух файлов, каталог одного уровня:

3、Предварительная обработка: gcc -E sum.c -o sum.i

Использовать после исполнения vi sum.i Вид После предварительной обработки из sum.i Содержание выглядит следующим образом:

Как видно из файла, содержимое файла очень длинное. файл головы , Заменяется на Конкретное содержимое кода файла заголовка , В коде Определение макроса Заменяется конкретным значением в коде Аннотации Быть Избавиться от . (Эквивалентно стадии приготовления ингредиентов)

4、Скомпилируйте: gcc -S sum.i -o sum.s

Компиляция предназначена для предварительной обработки .i файл Скомпилирован в .s язык ассемблера , После компиляции sum.s Содержание выглядит следующим образом:

Как видно из файла, то, что показывает этот файл, больше не Язык C Написанный код преобразован в Код языка ассемблера Если ты прав Однокристальный микрокомпьютер Поймите, вас также может заинтересовать ассемблер. грамматика Понимать. (Скомпилировать: Переводить язык C на язык ассемблера )

5、Компиляция: gcc -c sum.s -o sum.o

Компиляция ставить Файл сборки становиться двоичный файл , После компиляции sum.o Содержание выглядит следующим образом:

Как видно из файла, скомпилированного в двоичный файл После этого содержимое внутри больше не видно.

6、Ссылка: gcc sum.o -o sum

использовать компоновщик gcc Положить двоичный файл Ссылка в один запускаемый файл , Объедините соответствующий код из библиотеки функций в целевой файл. к ./sum Исполняемый файл может быть выполнен, и результат выполнения будет следующим:

Если вы откроете исполняемый файл sum , Отображаемое содержимое и sum.o почти.

Во-вторых, исполняемый файл и файл заголовка находятся на одном уровне.

Если вы скомпилируете напрямую (gcc sum.c -o sum), вам будет предложено, что файл заголовка не может быть найден, как показано ниже:

Есть два решения, чтобы не найти файл заголовка:

  • Укажите расположение файла заголовка непосредственно при написании программы
  • Использовать при компиляции -I параметр , Где указан заголовочный файл папка позиция

В-третьих, использование других параметров gcc

1. Параметр-D: укажите определение макроса.

В приведенной выше программе printf() Отладка программы печати информация журнала , Но когда программа будет выпущена, нам не понадобится эта информация журнала, конечно, мы можем добавить отладку #define DEBUG Объявление макроса, однако, этот метод явно не подходит, когда имеется много информации журнала, которую необходимо отладить и вывести в программу.

Теперь ставим DEBUG Закомментируйте определение макроса

Информация, распечатанная с помощью печати, не будет выводиться. Если вы распечатаете информацию еще раз, вы можете передать параметры в это время -D , В программу при выполнении команды Укажите макрос ,следующее:

Вы можете распечатать сейчас printf() Информация.

-D Функция параметра: не определять макрос в программе, а определять его при компиляции программы. Если не указан, printf () будет удален во время предварительной обработки программы.

2. Параметр -O: оптимизировать код при предварительной обработке программы.

При предварительной обработке программы код оптимизируется, а избыточный код удаляется. Существует три уровня оптимизации:

  • -O1: низкий уровень оптимизации
  • -O2: На уровне оптимизации
  • -O3: высокий уровень оптимизации

3. -Wall параметр: вывод предупреждающей информации в программе

Например, мы определяем переменную в программе int aa; , Но не используется, в это время будет выведено предупреждающее сообщение.

4. Параметр -g: добавить в программу некоторую отладочную информацию.

  • плюс -g После параметров выходной исполняемый файл будет больше, чем не добавленный (поскольку он содержит отладочную информацию)
  • Релиз программы не нужно добавлять -g параметр
  • Нужно добавить для отладки -g Параметр, иначе его нельзя отладить без отладочной информации. ( Этот параметр необходимо добавить при отладке gdb. )

подводить итоги:

Параметры: -E 、 -S , Не очень важно, -c Это более важно. Позже нам нужно будет использовать сгенерированные при создании статических и динамических библиотек. .o файл двоичных значений 。

2 Создание статической библиотеки gcc

Например, если вы работаете над проектами вместе с другими, вы не можете напрямую Исходный код Дайте его человеку, чтобы он мог разработать его самостоятельно, потому что исходный код — это ваша основная технология. Вы не должны продавать ему Исходный код , Но так должно быть программа , Таким образом, вы можете изменять или добавлять функциональные модули в соответствии с его потребностями, и вы можете взимать плату за каждое изменение, так что вы можете иметь долгосрочное сотрудничество.

Читайте также:  Фильтры windows smartscreen предотвратил запуск как отключить

Итак, что нужно дать покупателям?

  • Созданная библиотека
  • файл головы

Поставить так Созданная библиотека с файл головы Его также могут использовать заказчики, но он не знает, как это реализовать. Чтобы двое могли поддерживать одну долгосрочное партнерство 。

Соответствует заголовочному файлу .c файл Все упакованы Статическая библиотека с Динамическая библиотека Внутри.

2.1 Процесс создания статической библиотеки

Во-первых, создание статической библиотеки

1. Правила именования

  • 1) lib + имя библиотеки + .a
  • 2) Например: libmytest.a

2. Этапы производства:

  • 1) Создайте соответствующий .o двоичный файл .c —> .o eg: gcc sum.c -c sum.o
  • 2) Будет сгенерирован .o упаковка файлов ,использовать ar rcs + имя статической библиотеки (libMytest.a) + все сгенерированные .o
  • 3) Опубликуйте и используйте статическую библиотеку:
    • Опубликовать статическую библиотеку
    • файл головы
  • Положить .c Файл, то есть Исходный код Конвертировано в .o из двоичный файл После этого клиенты не узнают о вашем Основная технология Как это случилось?
  • ar правда .o двоичный файл для упаковки , rcs — это параметр упаковки , Положить все из .o двоичный файл Упаковано в один .файл ,который: Статическая библиотека . следовательно: Статическая библиотека — это набор упакованных двоичных файлов. 。
  • интерфейс API В файл головы Отражено в.

Описание:

  • включить папку: хранить файлы заголовков, предоставленные пользователю для вызова Интерфейс API
  • Папка lib: хранить файлы библиотеки, а именно: сгенерированную статическую библиотеку, динамическую библиотеку
  • Папка src: хранить исходные файлы
  • Программа main.c: вызывается пользователем заголовочный файл head.h Интерфейс внутри, а затем вызывается алгоритм, который мы реализовали в статической библиотеке (просто это уже не исходный код, а скомпилированный в двоичный файл)

Исходный код src / add.c Реализация — операция сложения:

Заголовочный файл include / head.h Реализация вызывается из исходного кода Интерфейс API :

main.c — вызвать файл заголовка, а затем вызвать статический файл, использование алгоритма, но я не знаю конкретный исходный код реализации алгоритма.

Пользователь в main.c Представляем заголовочный файл #include «head.h» , Я ем ./include/head.h , Вы можете использовать ./include/head.h Интерфейс определен в int add(int a, int b); ,когда main.c Выполнение программы до add(int a, int b); Интерфейс, он приедет ./src Найдите статические файлы в папке (упакованные двоичные файлы, а именно: конкретная реализация алгоритма сложения)

Ниже приводится конкретный производственный процесс:

  • Созданные статические файлы необходимо поместить в каталог lib
  • Вызовите интерфейс API в файле заголовка, а затем используйте gcc Скомпилирован с автоматическим запуском main.c Файл, нужно добавить Статические файлы (файлы .a) 。
  • Когда программа будет выпущена, вам нужно только предоставить пользователю файл:
    • 1) Заголовочный файл (head.h) в каталоге include: инкапсулирует интерфейс API, реализованный с помощью определенного алгоритма.
    • 2) Статические файлы (файлы .a) в каталоге lib: двоичные файлы (файлы .o) после компиляции исходного кода, а затем упакованные в статические файлы (файлы .a)

Другой метод вызова статической библиотеки:

gcc main.c -Iinclude -L lib -l MyCalc -o myapp

  • -I Параметр: укажите имя папки, в которой находится текст заголовка, имя папки можно вставить и записать с параметром
  • -L Параметры: укажите имя папки статической библиотеки.
  • -l Параметры: укажите имя статической библиотеки, но имя должно быть оборвать оба конца , Например: исходное имя статической библиотеки libMyCalc.a , В указанном -l Когда значение параметра: -l MyCalc
  • -o Параметры: вывести имя исполняемого файла после компиляции

Причина использования -l Укажите имя статической библиотеки, потому что lib В каталоге может быть несколько файлов статической библиотеки, но нам нужно использовать только один из них.В настоящее время мы можем использовать этот метод, чтобы указать соответствующий файл статической библиотеки.

Во-вторых, просмотрите связанные файлы статической библиотеки.

1、 команда nm Просмотр статической библиотеки

можно использовать команда nm Проверьте, что конкретно упаковано в файл статической библиотеки двоичный файл который .o файл

2、 команда nm Просмотреть сгенерированный исполняемый файл

T : Значение представителя заключается в том, чтобы add Код будет размещен Область кода

2.2 Преимущества и недостатки статических библиотек

1. Создавайте исполняемые файлы с помощью статических библиотек.

  • Есть несколько .o файл
  • Вызов функции в соответствующем исполняемом файле (двоичном файле) в статической библиотеке в main.c
  • На рисунке вызываются только функции в add.o и sub.o, поэтому main.c будет использовать только статические файлы при создании исполняемых файлов. add.o с sub.o Два файла упакованы в исполняемый файл, остальные в статическом файле не используются. .o Файл не будет упакован в исполняемый файл.
  • При создании исполняемого файла он также основан на .o исполняемый файл за единица измерения Упаковано, и целиком не поставлю Статический файл .a Все они упакованы в исполняемые файлы.

Преимущества статических библиотек:

  • 1) При выпуске программы нет необходимости предоставлять соответствующую библиотеку, потому что библиотека была упакована в исполняемый файл.
  • 2) Скорость загрузки библиотеки относительно высока, поскольку библиотека упакована в исполняемый файл.

Недостатки статических библиотек:

  • 1) Библиотека упакована в приложение (конечный исполняемый файл), если библиотек много, это приведет к заявление Объем огромен.
  • 2) Библиотека изменилась и нуждается в Перекомпилируйте программу , Если исходного кода больше, его можно скомпилировать за один день.

3 Производство динамической библиотеки / разделяемой библиотеки gcc

Динамическая библиотека Также известный как Общая библиотека , Работает в windows .dll файл

3.1 Процесс создания динамической библиотеки / разделяемой библиотеки

1. Описание динамической библиотеки

1. Правила именования:

  • 1) lib + имя + .so
  • 2) Например: libMyCalc.so

2. Этапы производства:

  • 1) Сгенерируйте независимый от позиции код (сгенерируйте независимый от позиции .o)
  • 2) Пакет .o в общую библиотеку (динамическую библиотеку)
  • 3) Публикуйте и используйте общие библиотеки:
  • Создано статической библиотекой .o файл Это связано с местоположением
  • использовать gcc Независимый от позиции .o файл , Необходимо использовать параметры -fPIC (общий) или -fpic

Два, связанных с производством динамических библиотек примеров

В понимании того, что имеется в виду под поколением и позиционно-независимым .o файл , Давайте сначала разберемся Виртуальное адресное пространство 。

Открыть в Linux Программа бега ( процесс ), операционная система выделит ему один (для 32-битных операционных систем) Адресное пространство 0-4G ( Виртуальное адресное пространство ), Виртуальное адресное пространство не на В памяти , Но из жесткий диск Пространство для хранения.

0-3G: это пользовательская область

  • .text сегмент кода: сохранить код
  • .data: хранит инициализированные переменные
  • .bss: хранит неинициализированные переменные
  • Пространство кучи:
  • Общая библиотека: пространство динамической библиотеки, динамическая библиотека загружается в это пространство каждый раз при запуске программы
  • Пространство стека: что мы определяем Локальная переменная Все в Пространство стека распределен баран
  • Параметры командной строки
  • Переменная окружения
Читайте также:  Cst dp 24 драйвер windows 10

Вверх 3-4G Является ли область ядра

  • Создание статической библиотеки и Связано с местоположением из Двоичный файл (файл .o)

Виртуальное адресное пространство от 0 начало , Результирующий двоичный файл (файл .o) Будет надет Фрагмент кода , который .text область кода . Создано Код .o каждый раз помещается в одно и то же место. , Потому что он использует Абсолютный адрес 。

  • Генерация динамической библиотеки и Независимый от позиции из Двоичный файл (файл .o)

Динамическая библиотека / общая библиотека .o файл Пакет в запускаемый файл В, только что сделал Запись , когда После запуска программы Просто зайдите в программу и загрузите динамическую библиотеку, то есть загрузите на картинку выше Общая библиотека Пространство, но каждый раз при загрузке Общая библиотека Пространственный Расположение может быть другим 。
по-прежнему имеет ту же структуру каталогов, что и статическая библиотека выше:

Пример создания динамической библиотеки

  • -PIC : Генерировать независимые от позиции .o файл
  • -shared: Поделиться — это поставить .o Файлы, упакованные в Динамическая библиотека / общая библиотека

Вышеупомянутое завершило создание динамической библиотеки, а затем поместили следующие два файла релиз дайте Пользователь Может позвонить

  • include / head.h: заголовочный файл, который определяет интерфейс API.
  • lib / libMyCalc.so: динамическая библиотека, которая инкапсулирует двоичный файл скомпилированного исходного кода.

Пользователь использует динамическую библиотеку

Пользователи могут использовать динамические и статические библиотеки двумя способами:

  • Пользователь использует первый метод динамической библиотеки:

gcc main.c lib/libMyCalc.so -o app -Iinclude

  • Пользователь использует второй метод динамической библиотеки:

gcc main.c -Iinclude -L lib -l MyCalc -o myapp

3.2 Динамическая библиотека не может найти решение

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

Это реально связь Нет, мы можем передать команду ldd : Вид запускаемый файл в выполненный когда, полагаться все Общая библиотека / динамическая библиотека (файл .so)

команда ldd использовать:

Как показано выше: исполняемая программа ./a.out При выполнении вызов должен вызывать динамическую библиотеку libmytest.so , Но на самом деле этот звонок проходит Динамический компоновщик Звонить. Динамическая библиотека реализована через Динамический компоновщик — / lib64 / ld-linux-x86-64.so.2 Загружается в нашу исполняемую программу (приложение).

потом Динамический компоновщик — /lib64/ld-linux-x86-64.so.2 Какие правила используются для поиска динамических файлов, которые нужны исполняемому файлу при его запуске?

Фактически, это через Переменная окружения

Просмотреть переменные среды под Linux:

Конечно, PATH — это не путь, по которому хранится динамическая библиотека. Это просто демонстрация того, как просматривать переменные среды.

Во-первых, динамическая библиотека не может найти решение одно ( Не рекомендуется-не допускается )

Поместите свою собственную динамическую библиотеку в Корневая директория Вниз Системная динамическая библиотека Средний, то есть / lib каталог


Как видно из результатов выше, после копирования созданной вами динамической библиотеки в системную динамическую библиотеку, Динамический компоновщик Эту динамическую библиотеку можно найти в соответствии с переменными среды, а затем правильно загрузить в исполняемую программу.

Этот метод обычно не используется, потому что, если имя вашей динамической библиотеки совпадает с именем динамической библиотеки в системе, это может привести к сбою системы! ! ! Это просто демонстрация, чтобы доказать, что динамический компоновщик находит динамическую библиотеку для загрузки в соответствии с переменными среды.

Во-вторых, динамическая библиотека не может найти решение два ( Временная тестовая установка )

Добавив динамическую библиотеку в Переменные среды динамической библиотеки ,который: LD_LIBRARY_PATH

использовать export Добавить переменные среды, добавить расположение текущей динамической библиотеки (расположение папки) в LD_LIBRARY_PATH В переменной исполняемая программа будет изменена из динамической библиотеки по умолчанию до того, как LD_LIBARAY_PATH Найдите в переменной необходимую динамическую библиотеку.

Однако этот метод только временный , Когда мы закроем терминал, в следующий раз, когда мы запустим программу, она сообщит, что динамическая библиотека не может быть найдена. Поэтому этот метод обычно Разработать динамическую библиотеку В процессе Временный тест 。

В-третьих, динамическая библиотека не может найти решение три ( Постоянные настройки — обычно не используются )

в Текущий пользователь из Домашний каталог ( home ) Под .bashrc Конфигурация в файле LD_LIBRARY_PAHT Переменные среды.

После добавления переменных среды выше вы можете найти динамическую библиотеку.

В-четвертых, динамическая библиотека не может найти решение четыре ( Постоянно установлен )

Этот метод относительно сложнее, чем первые три. Его необходимо освоить. Это тот, который может быть использован в будущем. Подход следующий:

1. Нужно найти Динамический компоновщик из Конфигурационный файл : /etc/ld.so.conf
2. Поместите абсолютный путь к каталогу динамической библиотеки, который мы создали сами. Записать в файл конфигурации
3. Обновите файл конфигурации: sudo ldconfig -v

  • ld: аббревиатура динамической библиотеки динамической библиотеки
  • -v: вывести информацию об обновлении, когда файл конфигурации будет более подробным.

Измените путь к файлу конфигурации: /etc/ld.so.conf

Положить /home/shliang/shliang/gcc_learn/Calc/lib добавить в /etc/ld.so.conf Конфигурационный файл

Затем вы можете найти динамическую библиотеку следующим образом:

3.3 Преимущества и недостатки динамических библиотек

1. Преимущества динамических библиотек

  • Размер исполняемой программы невелик: когда программа выполняется, загружается динамическая библиотека, и она не упаковывается с исполняемой программой.
  • Динамическая библиотека обновляется, и нет необходимости перекомпилировать программу (не обязательно, при условии, что интерфейс функции остается неизменным, а содержимое в порядке)

2. Недостатки динамических библиотек

  • Когда программа будет выпущена, пользователю необходимо предоставить динамическую библиотеку.
  • Динамическая библиотека не упакована в приложение, и скорость загрузки относительно низкая.


♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

Источник

Оцените статью