Работа с библиотеками и зависимыми файлами C++ с помощью Clickable

Если работа приложения зависит от библиотеки, по умолчанию не установленной в Ubuntu Touch, то приложение должно взять его из click-пакета. В этой статье рассказывается, как с помощью Clickable создать такой пакет.

Сборка

Иногда в наличии есть уже готовые библиотеки, что позволяет пропустить этап сборки. Однако рекомендуется компилировать файлы зависимостей, так как это дает больше контроля над всем процессом и может привести к лучшим результатам (например, лучшая производительность или меньшие размеры пакетов).

Компиляция

Скопируйте исходный код библиотеки в папку libs/LIBNAME. Эта папка по умолчанию установлена в clickable. Если исходный код нужных библиотек есть в репозиториях git, можно добавить эту библиотечку как модуль git. В противном случае придётся добавить скрипт для скачивания исходных кодов.

Добавьте раздел с библиотечками в файл clickable.json, как это показано в примере:

 {
   "builder": "cmake",
   "libraries": {
     "LIBNAME": {
       "builder": "cmake"
     }
   }
 }

If the library does not contain a CMake configuration, you need to use the qmake or custom builder instead.

Дополнительно настройте процесс компиляции - добавьте опцию build_args. Это будет выглядеть так:

 {
   "builder": "cmake",
   "libraries": {
     "LIBNAME": {
       "builder": "cmake",
       "build_args": [
         "-DBUILD_EXAMPLES=OFF",
         "-DBUILD_DOCS=OFF",
         "-DBUILD_TESTS=OFF",
         "-DBUILD_SHARED_LIBS=OFF"
       ]
     }
   }
 }

Подбор аргументов обычно зависит от настроек проекта. Поэтому изучите инструкции по сборке библиотеки, а также посмотрите настройки параметра `` option`` в файле `` CMakeLists.txt`` (если используется CMake). По умолчанию, директория для сборки build/LIBNAME/ARCHITECTURE. Поэтому сборки для разных архитектур могут существовать параллельно.

Чтобы действительно собрать библиотеку, запустите процесс командой`` clickable build-libs``. Можно собрать и версию для настольного компьютера с помощью команды clickable build-libs --arch amd64. Не забудьте отметить эти шаги в файле README!

Посмотрим, как Teleports clickable.json использует библиотеки для сборки файла зависимостей tdlib.

Предустановленные библиотеки

Если Вы скомпилировали библиотеку, как описано выше, пропустите этот шаг.

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

Если библиотека есть в официальных репозиториях Ubuntu, можно добавить ее в список файлов зависимостей:

 {
   "builder": "cmake",
   "dependencies_target": [
     "libsomething-dev"
   ]
 }

Clickable автоматически установит указанный пакет внутри контейнера сборки для нужной архитектуры. Пример можно посмотреть в приложении `Guitar Tools' - вот его json-файл-<https://github.com/t-mon/guitar-tools/blob/master/clickable.json#L4>`_.

Если библиотека отсутствует в официальных репозиториях Ubuntu, но есть в PPA, можно добавить PPA в файл clickable.json. Например:

 {
   "builder": "cmake",
   "dependencies_ppa": [
     "ppa:someone/libsomething"
   ],
   "dependencies_target": [
     "libsomething-dev"
   ]
 }

В противном случае нужно будет добавить скрипт для скачивания предустановленной библиотеки.

Использование

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

Если в библиотеке есть подходящий конфигурационный файл CMake, можно использовать команду find_package, она поможет связать двоичный файл библиотеки и каталоги include. Дополнительные параметры в файле CMakeLists.txt могут выглядеть так:

find_package(SOMELIBRARY REQUIRED)

include_directories(${SOMELIBRARY_INCLUDE_DIRS})
target_link_libraries(mytarget ${SOMELIBRARY_LIBS})

Команда find_package определяет путь к каталогу include как SOMELIBRARY_INCLUDE_DIRS, а готовые бинарные файлы библиотеки как SOMELIBRARY_LIBS. Мы используем эти переменные с командами include_directories и target_link_libraries. Пример того, как это работает можно посмотреть в файле Camera Scanner ImageProcessing CMakeLists.txt <https://github.com/jonnius/camera-scanner/blob/master/plugins/ImageProcessing/CMakeLists.txt#L23> _ .

На этом этапе вы уже должны иметь возможность протестировать рабочий стол в режиме clickable desktop.

Размещение

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

Узнайте, какие общие файлы объектов (* .so) нужно отправить. Это можно сделать, запустив приложение на своем устройстве через clickable && clickable logs. Должно появиться сообщение об ошибке, сообщающее, какой общий файл объекта отсутствует.

Найдите путь к файлам общих объектов. Если библиотека создана с помощью clickable, то эти файлы находятся в каталоге установки библиотеки. По умолчанию, папка находится внутри каталога сборки библиотеки (например, build/arm-linux-gnueabihf/opencv/install). Для готовых библиотек запустите команду clickable run "find / -name 'libSomething.so'" (заменив libSomething.so на файл, который ищете). Это выведет на экранпуть к файлу (вместе с некоторыми сообщениями об ошибках, которые можно игнорировать). В общем, при поиске файлов общих объектов лучше всего использовать /usr/lib.

Чтобы поместить файлы в click-пакет, добавьте ключ install_lib <http://clickable.bhdouglass.com/en/latest/clickable-json.html#install-lib> _ в файл clickable.json:

 {
   "builder": "cmake",
   "libraries": {
     "LIBNAME": {
       "builder": "cmake",
       "install_lib": [
         "$LIBNAME_LIB_INSTALL_DIR/usr/lib/$ARCHITECTURE_TRIPLET/libqmapboxgl.so*",
         "/usr/lib/$ARCHITECTURE_TRIPLET/libSoundTouch.so.*"
       ]
     }
   }
 }

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

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

Нужно настроить всё для сборки и установки click-пакета на устройстве, подключенном к компьютеру, запустив clickable.