- Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Re: Статическая сборка программ
- Кросс-компиляция Qt5 под Linux для Win x32/x64/static/shared
- 0. Сценарий сборки
- 1. Предварительная подготовка
- 2. Установка среды кросс-компиляции MXE
- Русские Блоги
- Компиляция gcc, создание статической библиотеки и динамической библиотеки в Linux
- Компиляция, статическая библиотека, динамическая библиотека gcc в Linux
- 1 процесс компиляции gcc
- 1.1 Процесс компиляции gcc
- 1.2 Общие параметры gcc
- 2 Создание статической библиотеки gcc
- 2.1 Процесс создания статической библиотеки
- 2.2 Преимущества и недостатки статических библиотек
- 3 Производство динамической библиотеки / разделяемой библиотеки gcc
- 3.1 Процесс создания динамической библиотеки / разделяемой библиотеки
- 3.2 Динамическая библиотека не может найти решение
- 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 из двоичный файл Ссылка на исполняемый файл
Четыре этапа компиляции команд:
- Предварительная обработка: 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
Например, если вы работаете над проектами вместе с другими, вы не можете напрямую Исходный код Дайте его человеку, чтобы он мог разработать его самостоятельно, потому что исходный код — это ваша основная технология. Вы не должны продавать ему Исходный код , Но так должно быть программа , Таким образом, вы можете изменять или добавлять функциональные модули в соответствии с его потребностями, и вы можете взимать плату за каждое изменение, так что вы можете иметь долгосрочное сотрудничество.
Итак, что нужно дать покупателям?
- Созданная библиотека
- файл головы
Поставить так Созданная библиотека с файл головы Его также могут использовать заказчики, но он не знает, как это реализовать. Чтобы двое могли поддерживать одну долгосрочное партнерство 。
Соответствует заголовочному файлу .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: хранит неинициализированные переменные
- Пространство кучи:
- Общая библиотека: пространство динамической библиотеки, динамическая библиотека загружается в это пространство каждый раз при запуске программы
- Пространство стека: что мы определяем Локальная переменная Все в Пространство стека распределен баран
- Параметры командной строки
- Переменная окружения
Вверх 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. Недостатки динамических библиотек
- Когда программа будет выпущена, пользователю необходимо предоставить динамическую библиотеку.
- Динамическая библиотека не упакована в приложение, и скорость загрузки относительно низкая.
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠
Источник