для запуска приложения необходимо установить дополнительные библиотеки

Как создавать, собирать, устанавливать и использовать пакеты с программами и библиотеками для UNIX-подобных систем

Речь пойдёт о программах и библиотеках для UNIX-подобных систем, распространяемых в виде исходного кода (в том числе в виде тарболлов), написанных обычно на C и C++ (хотя этот же порядок работы может применяться к софту на любом языке). Многие вещи в этой статье написаны применительно конкретно к GNU/Linux, хотя многое из статьи может быть обобщено и на другие UNIX-подобные ОС.

Под словом «пакет» я понимаю в этой статье пакет с исходными текстами, причём не пакет конкретного дистрибутива GNU/Linux, а просто пакет, исходящий от оригинальных авторов софта (UPD от 2017-02-09: кроме тех случаев, где из контекста ясно, что слово «пакет» употреблено в другом смысле).

В этой статье я разберу следующие вопросы:

И ещё одно предупреждение. Я написал эту статью наскоро для одного человека. А после написания подумал, мол, раз уж написал, выложу уж на Хабр, чтоб не пропала. Поэтому в статье есть недочёты типа нечёткого структуирования статьи, фраз типа «не осуществляет сама инклудивание» и пр. Я это исправлять не буду. Может когда-нибудь в следующей жизни, когда руки дойдут. Выбор был между тем, чтобы публиковать так или не публиковать вовсе.

Итак, начнём мы с того, что создадим пакет с программой Hello, world. Для начала определимся с системой сборки.

Собственно, сама сборка пакета обычно осуществляется с помощью программы make (хотя это не единственный путь). Конфиг для make обычно лежит в файле под названием Makefile.

Есть несколько вариантов: просто использовать make либо использовать совместно с make некую высокоуровневую систему сборки (обычно autotools или cmake), которая будет, собственно, генерировать конфиги для make.

Мы в нашем примере будет использовать только make для простоты. Итак, создаём hello.c:

Внимание! Работает на GNU/Linux. Работа под macOS не гарантируется! Этот Makefile не является портируемым вообще на все UNIX-подобные системы! Подробнее будет дальше.

здесь означает символ табуляции.

Это далеко не единственный способ написать этот Makefile. Вообще, цель всей моей статьи — дать некую базу. Что ещё можно в этом Makefile изменить, вы можете потом узнать из других источников.

Итак, теперь давайте разбирать наш Makefile.

Для начала скажу следующее. Допустим, пользователь скачал пакет. Ему нужно сперва собрать его, т. е. получить бинарники в каталоге с самим пакетом (либо в случае out of tree build получить их в неком другом каталоге, что не меняет сути), а затем установить, т. е. скопировать полученные бинарники в место их окончательного хранения в системе.

То есть смотрите. Вы залогинены под юзером user. Ваш домашний каталог /home/user. Вы скачали пакет, распаковали его, скажем в /home/user/Desktop/foo. Далее вы его собрали. Собрали в этой же папке, /home/user/Desktop/foo. Либо, если речь идёт об out of tree build, вы создали ещё одну папку /home/user/Desktop/foo-build и собрали в ней. Теперь, после сборки вы решаете установить её в /usr/local. Вот тут уже вам нужны права root. Вы при помощи sudo устанавливаете эту программу в /usr/local.

Пара слов о размещении каталогов в системе. Разберу лишь некоторые каталоги. Более подробную информацию можно найти в Filesystem Hierarchy Standard (поддержан многими дистрибутивами GNU/Linux) и по команде «man 7 hier» в GNU/Linux и, возможно, других ОС. Во всяком случае я расскажу, как они были устроены, скажем, лет пять назад (т. е. где-то в 2012-м году), всякие новые веяния типа недавнего нововведения в Fedora «давайте-ка мы всё переместим в /usr» я рассматривать не буду.

То есть, например, вы устанавливаете пакет, указывая ему prefix /usr/local. Тогда бинарники пойдут в /usr/local/bin, бинарные файлы библиотек — в /usr/local/lib и так далее.

Теперь вернусь к разбору Makefile. PREFIX — это и есть тот prefix, про который я сейчас говорил. В качестве дефолтного префикса (пользователь сможет его переопределить) у нас указан /usr/local — хороший дефолтный выбор. Обычно его всегда указывают в качестве дефолтного префикса при создании пакетов (к сожалению, некоторые пакеты этого всё же не делают, дальше будет подробнее). Далее идёт CC. Это стандартное название для переменной make, в которую кладут компилятор, в данном случае cc. cc — это в свою очередь обычно используемая команда для запуска компилятора по умолчанию в данной системе. Это может быть gcc или clang. На некоторых системах команда cc может отсутствовать. CFLAGS — стандартное название для переменной с флагами компиляции.

Если просто набрать make, то будет выполнена та цель, которая идёт в Makefile первой. Обычная практика в том, чтобы называть её all. И такая цель обычно собирает весь проект, но ничего не устанавливает. Эта цель обычно «виртуальная», т. е. у нас нет файла под названием all. Т. к. наша задача собрать лишь один бинарник hello, то мы просто делаем all зависящим от hello. Далее идёт описание цели сборки hello. Его можно было в принципе разбить на два этапа: сборка hello.o из hello.c и сборка hello из hello.o. Я так делать не стал для простоты.

Что делает install? Это почти то же, что и cp. Точные отличия я и сам не знаю. Для установки программ нужно использовать install, а не cp.

Здесь я предполагаю, что у вас на системе установлен так называемый BSD install. В GNU/Linux’е он есть. В некоторых системах его может не быть. Может быть какой-нибудь другой install, который в этой ситуации не сработает. Именно это я имел в виду, когда сказал, что работа в разных ОС не гарантируется.

Здесь я не рассматривал DESTDIR, который, между прочим, крайне рекомендуется использовать в Makefile. Я даже не рассматривал цель clean.

Это создаст архив, внутри которого есть каталог hello-1.0, который содержит hello.c и Makefile. Таков способ распространения пакетов.

C++-вариант пакета. Исходник будет тем же, его нужно будет назвать hello.cpp. Makefile будет таким:

Обратите внимание, что стандартное название переменной для флагов к компилятору C++ — это CXXFLAGS, а не CPPFLAGS. CPPFLAGS же — это название переменной для флагов к препроцессору C.

Теперь разберём, как устанавливать пакеты из сорцов (любые, программы и библиотеки). Независимо от системы сборки. Этот алгоритм будет пригоден в том числе для тарболла, который мы создали только что. Допустим, что пакет, который нужно собрать, тоже называется hello.

Первый шаг: скачать и зайти в папку с сорцами. Тут два варианта: скачиваем из системы контроля версий (я разберу для примера git) или скачиваем тарболл.

Первый вариант. git. Делаем clone:

Теперь нужно собрать. Будем считать для простоты, что мы не будем делать out of tree build (если автор пакета требует out of tree build, там обычно будут написаны инструкции, как это сделать). А значит, собирать мы будем в этой же папке, где сорцы. Т. е. в этой папке, в которую мы сейчас сделали cd.

Дальнейшие действия зависят от системы сборки, выбранной в проекте. Но независимо от системы сборки мы в процессе сборки должны будем указать prefix. Причём обычно его нужно будет указать именно на этапе сборки, а не на этапе установки, т. к. часто prefix захардкоживается внутрь бинарника. А это значит, что после установки программы в определённое место её нельзя просто так взять и передвинуть.

Я дам здесь примерные инструкции, работающие в большинстве случаев. Точные инструкции вы увидите у автора проекта, там могут быть разные нюансы.

Обязательно указывайте prefix при сборке (что бы там не писал в инструкции автор). Если вы не укажите, то будет выбран дефолтный. Обычно это /usr/local, и это достаточно хороший выбор. А если нет? Что если автор пакета указал какой-то другой дефолтный префикс? Вы установите непонятно куда. В частности libqglviewer использует в качестве дефолтного префикса /usr, что совершенно неправильно (я отправил автору баг репорт). Итак, совершенно всегда указывайте префикс. Читайте инструкции, которые автор указывает на своём сайте и прикидывайте, куда впихнуть prefix.

Итак, какие могут быть системы сборки. Во-первых, может быть просто make. Такой вариант с голым make встречается редко. Один из немногих пакетов с «голым» make — bzip ( www.bzip.org ). В случае с нашим hello-1.0.tar.xz, который мы создали, у нас именно такой вариант.

Итак, собирать в случае голого make нужно так:

(Конкретно в случае с bzip на этапе сборки указывать PREFIX не надо. Но теоретически можно представить себе пакет, который захардкоживает PREFIX внутрь бинарника. Поэтому в общем случае PREFIX нужен.)

Следующий вариант — это autotools. В этом случае собираем так:

Следующий вариант — cmake. Собираем так (обратите внимание на точку в конце команды cmake):

Откуда точка в конце? Дело в том, что cmake’у нужно передавать путь к сорцам. А поскольку у нас не out of tree build, мы собираем здесь же. Сорцы находятся там же, где находимся мы. Поэтому точка, т. е. текущий каталог.

Итак, собрали одним из этих способов. Что дальше? Теперь нужно установить.

В случае голого make это делается так:

Нужно будет указать тот же prefix, который вы указывали при сборке.

В случае autotools и cmake так:

В случае, если для записи в prefix вам нужен sudo, то вот эту команду для установки нужно будет набирать с sudo. Вообще, сборка всегда осуществляется с обычными правами, а вот установка осуществляется с теми правами, которые нужны, чтобы записать в prefix.

В результате бинарник положился в /foo/bin.

Теперь хочу ещё немного поговорить про префиксы. Какие префиксы вообще есть?

Префикс /. Вряд ли когда-нибудь вам придётся его выбирать. Он используется для программ, критичных для ранних стадий загрузки ОС (т. е. критичные элементы для загрузки находятся в /bin, /lib и т. д.) (впрочем, даже если вам нужно установить программу в /, её сперва устанавливают в /usr, т. е. собирают и устанавливают с префиксом /usr, а потом перемещают необходимое в / [т. е. перемещают из /usr/bin в /bin, скажем], во всяком случае именно так поступают авторы Linux From Scratch 7.10 с пакетом, скажем, bash).

Префикс /usr. Стандартный префикс, используемый обычно для программ, установленных через менеджер пакетов. То есть если вы установили программу через менеджер пакетов, она ведёт себя так, словно она собрана и установлена на вашей системе с префиксом /usr. Самому устанавливать пакеты с префиксом /usr нельзя.

Префикс /usr/local. Отличный префикс для установки туда программ самостоятельно. Хорош тем, что /usr/local/bin есть в дефолтном PATH (во всяком случае в дебиане). То есть сразу после установки программы вы сможете просто запускать программу по названию. Потому что бинарник лежит в /usr/local/bin, а /usr/local/bin есть в PATH. Плох тем, что там все программы лежат смешанно. Вот допустим, вы установили библиотеку foo, а потом библиотеку bar. Обе в этот prefix. Тогда дерево может выглядеть так (в совсем упрощённом виде):

Видите? Всё смешано. Нет единой папки, которая бы содержала «всё, связанное с foo» и другой папки, которая бы содержала «всё, связанное с bar». (Хотя это ваше дело, считать, что это действительно плохо или нет). Понятное дело, что такая же проблема присутствует при любой установке разных пакетов в один префикс. То есть префикс /usr страдает от того же: пакеты «размазаны» по системе (здесь уже речь идёт о пакетах, поставленных через менеджер пакетов, т. е. тех, которые, собственно, составляют систему). Собственно, это и есть одно из бросающихся отличий большинства UNIX-подобных систем от Windows. В Windows каждая программа находится в своей папке в Program Files. В большинстве UNIX-подобных систем она «размазана» по системе. (UPD от 2017-02-09: в Windows программы на самом деле тоже «размазаны», скажем, по реестру, просто это не так бросается в глаза.) Существуют дистибутивы GNU/Linux, «решающие» эту проблему, например, GoboLinux. Там каждый пакет в своём каталоге, как в Windows.

Префиксы вида /opt/XXX. Папку /opt предполагается использовать следующим образом: в ней нужно создавать подкаталоги, называть их названиями пакетов и использовать эти подкаталоги как префиксы. При таком подходе указанная выше проблема /usr/local (если считать её проблемой) исчезает. Каждый пакет будет установлен в свой каталог. Приведённый выше пример с foo и bar будет выглядеть так (я бы посоветовал в названии подкаталогов в /opt указывать ещё и номер версии):

Недостаток у такого решения тоже есть. Вам придётся самому добавлять все эти бесчисленные каталоги /opt/foo-1.0/bin (для каждого пакета) в PATH.

Префиксы, соответствующие домашним каталогам. Т. е., скажем, /home/user. Советую в случае, когда хочется поставить «только для себя», т. е. только для одного юзера. Или когда нет прав root. Возможно, ваши конфиги, поставляемые с ОС уже настроены таким образом, чтобы помещать

/bin в PATH при условии, что такой каталог есть. Так что PATH будет настроен как надо.

Каждый префикс может содержать в себе свои bin, sbin, lib, include и т. д.

Итак, что из этого выбрать? Если нужно поставить на всей системе, то я бы посоветовал /opt/XXX. Я сам так обычно ставлю.

Допустим, нужно собрать некий файл a.c с этой библиотекой. Как это сделать?

Во-первых, вверху файла нужно написать #include, соответствующий подключаему хедеру. Ну а собирать нужно так:

Давайте разбираться. Для начала скажу, что I (большая английская и) и l (маленькая английская эль) — это две разные буквы. Не перепутайте их в приведённых командах.

Первая команда производит компиляцию, то есть создаёт a.o на основе a.c. Вторая — линковку, то есть окончательный бинарник на основании a.o.

Можно соединить две наши команды в одну, тогда будет что-то такое:

Если вы установите у себя на машине libfoo и libfoo-dev, то результат будет как если бы вы сами собрали пакет foo из исходных кодов с префиксом /usr. У вас на системе будут, скажем, файлы:

Источник

Блог Евгения Крыжановского

Я научу вас ремонтировать свой компьютер!

Установка необходимых библиотек на ПК

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

Зачастую столь полезные компоненты являются бесплатными. Среди перечня элементов есть установочные пакеты исполнительной среды. Также присутствуют полезные сборники dll библиотек. Важные дополнения и компоненты просто необходимы для обеспечения жизнедеятельности ПК.

Если устройство работает на платформе Windows, то без дополнительных помощников просто не обойтись. Если компоненты повреждены, то работоспособность устройства может быть под угрозой. Так что крайне важно побеспокоиться о своевременной установке и обновлении каждого элемента в отдельности.

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

Поиск и загрузка недостающих элементов. Работа с дистрибутивами

Каждому пользователю нужно сделать так, чтобы все важные объекты были моментально установлены. Скачать сборки библиотек и установочных дистрибутивов придется первым делом. Также важно произвести загрузку официальных пакетов Microsoft.

NET Framework от данного разработчика – это универсальный пакет дистрибутивов. В нем сосредоточены наиболее актуальные элементы. Пользователям удается официальные установочные пакеты загрузить подключения к интернету. Так что даже без непосредственного соединения с сеть удается выполнить установку.

Данная платформа от Microsoft является необходимой и востребованной. Эта особенная среда программирования была презентована для тех устройств, которые функционируют именно на системе Windows. При этом может быть загружена любая версия ОС. Также NET Framework используется на операционных системах.

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

Так что компьютер и прочие устройства могут быть максимально полезными благодаря NET Framework. Многокомпонентная программа постоянно обновляется. Каждая последующая версия данного приложения является не заменой предыдущего варианта. При установке новой версии происходит загрузка совершенно нового полноценного объекта.

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

Данная пакетная утилита распространяется в различных версиях. Есть специальная программа для Windows x86. Софт также является официальным установочным дистрибутивом, который был презентован профессионалами корпорации Microsoft. Бесплатное распространение утилит дает возможность скачать приложение на любые ПК.

Также предлагается скачать программу с наличием русификатора. В таком случае обеспечится максимально корректная работа многочисленных ранее загруженных приложений, игр и программ. Пользователи всех версий Windows могут выполнить установку версии NET Framework 1.1.

На сайте компании-разработчика представлены приложения и других версий. Так что бесплатно удается скачать NET Framework с улучшенным функционалом. Достаточно выбрать между версиями 2.0, 3.0, 3.5, 4.0 и прочими. При загрузке пакетного приложения обеспечена улучшенная работа многих компонентов. Это касается функции кэширования.

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

При использовании версии NET Framework 3.0 удается воспользоваться достоинствами данной платформы. Совершенно новая модель программирования применяется для грамотной работы с приложениями. В дополнение к этому удается создавать некоторые утилиты.

Мультиплатформенная версия для Windows х64/x86 – это наиболее профессиональная версия. Приложение без проблем работает на самых разных версиях данной платформы. Утилита также существует в версии 3.5. Пакетный программный продукт содержит множество новых функций.

Софт является полноценным накопительным обновлением. В составе приложения пользователи найдут абсолютно все ранее выпущенные обновления. Если пользователь решит использовать современный сервис, в котором сосредоточены все подкомпоненты, то лучшим вариантом является NET Framework 4.

Данный программный продукт прекрасно работает со всеми компонентами, ранее установленными. Так что все версии данной платформы могут работать очень гармонично, не приводя к возникновению конфликтов. Самая последняя версия утилиты – это NET Framework 4.5 Final. Программное обеспечение работает на самых обновленных версиях операционной системы.

Официальные дистрибутивы в обновленных версиях

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

Утилита создана для гарантированно профессионального функционирования устройств на платформе Windows. Компания Microsoft – это всемирно известный разработчик, которому удалось презентовать актуальные программные продукты. Многие из разработанных утилит являются наиважнейшим комплексом технологий.

DirectX 9.0 – это самая актуальная версия для Windows XP. Приложение распространяется бесплатно. Утилита загружается на устройства, но при этом необходимо учитывать все аспекты, касающиеся совместимости обновленных компонентов DX9. Только в таком случае обеспечивается грамотное функционирование пакетного приложения.

Особое внимание уделяется конфигурации винчестера и прочих объектов. Также не стоит забывать о технических характеристиках установленной версии системы. В общем, при выборе подходящей версии данного дистрибутива нужно учесть огромное количество факторов. Только на основании проведенных исследований осуществляет подбор нужной версии.

DirectX – это пакетная утилита, которую просто невозможно заменить прочими приложениями. Программное обеспечение является актуальным для всех устройств. Сервис обеспечивает запуск и дальнейшую корректную работу большинства загруженных в компьютер приложений.

Разработчики презентовали много версий данного программного продукта. Они рассчитаны на работу в различных версиях операционной системы. Если пользователь работает с Windows XP, Vista или 7-ой версией данной платформы, то достаточно выполнить установку DirectX.

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

Проблемы связаны с отсутствием важных компонентов. Также не установлены библиотеки. Так что верным решением является установка DirectX. Данный компонент способен моментально устранить огромное количество проблем. По итогу будут загружаться программы, игры и приложения, которые ранее не работали.

Аналогов DirectX достаточно много, но при этом ни один подобный программный продукт не способен обеспечить грамотную работу устройства и всех находящихся в нем объектов. При работе с Windows пакетная утилита DirectX является незаменимым атрибутом.

Кроме стандартной версии также предусмотрено наличие прочих. Одной из них является программа для Windows 7. Версия программы разработана именно под данный вариант платформы. Так что пользователи могут подобрать наиболее актуальный сервис. В дополнение к этому предусмотрено наличие версии 10.1 для Windows XP и Vista.

Был презентован официальный выпуск данного дистрибутива. Это актуальный финальный релиз. Именно он является окончательно завершенным пакетом. В его составе есть наиболее актуальные библиотеки, которые идеальным образом встраиваются в Windows XP. Данная версия является последней в линейке 10-ой разработки.

Далее создатели приступили к реализации совершенно новой концепции. По итогу была презентована пакетная программа DirectX11. Софт порадует многочисленными дополнениями и доработками. Ознакомиться с перечнем возможностей можно на официальном сайте компании Microsoft.

Еще один дистрибутив для Windows

Также пользователи обращают внимание на Java Runtime Environment. Данное программное обеспечение является финальной версией официального дистрибутива. За счет наличия на персональном компьютере библиотек и компонентов Java обеспечивается создание специальной исполнительной среды.

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

Обновленная версия программного продукта снабжена наиболее актуальными дополнениями. Последние исправления системы безопасности также были выполнены в финальной версии Java Runtime Environment.

Виртуальная машина Java, поспособствовала создания огромного количества современных программ. На этом языке презентованы полезные приложения, с которыми предпочитают работать миллионы пользователей. Компоненты пакетного приложения – это актуальные библиотеки, без которых невозможно осуществить запуск многочисленных программ.

Причем, это касается не только приложений, загруженных на ПК. Также пользователи не смогут выполнить запуск программ и игр в интернете. В общем, крайне важно обеспечить наличие таких утилит на компьютере. Также Java Runtime Environment способствует полноценному общению в игровом процессе.

Обновленная версия есть на официальном сайте разработчика. Так что пользователям, которые отдают предпочтение именно этому программному продукту, стоит не медлить и перейти к загрузке утилиты. С помощью пакетного приложения устройство начнет работать более функционально и организованно.

Актуальный набор с библиотеками

Программа dll RuntimePack – это особенный пакетный набор библиотек. Приложение было презентовано в обновленном варианте, в котором особого внимания заслуживает функционал. Утилита устанавливается в автоматическом режиме. Данный софт также не требует регистрации, чтобы начать активные действия на ПК.

В основе программы компоненты dll и ocx. Также есть необходимые библиотеки. Все эти объекты нужны для осуществления работы системы в максимально стабильном и корректном режиме. Так что после установки утилиты обеспечивается грамотное функционирование каждого находящегося на компьютере приложения и игры.

Обновленный функциональный сервис dll RuntimePack содержит именно те библиотеки, классы и компоненты, которых не хватает в устройстве. До установки программы пользователи могут достаточно часто встречать на мониторе окна с текстами о появлении ошибок разного характера.

Visual C++ от Microsoft

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

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

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

Запись опубликована 22.02.2016 автором katrinas11 в рубрике Программы. Отблагодари меня, поделись ссылкой с друзьями в социальных сетях:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *