Подключение библиотек в приложениях на ОС Аврора
Существует три основных способа подключения любой библиотеки:
-
Взять исходники библиотеки и встроить в свой проект напрямую. Это самый простой способ, но в таком случае каждый раз библиотека будет пересобираться заново. А это может сильно уменьшить скорость сборки приложения.
-
Использовать статические библиотеки, которые компонуются во время компиляции приложения. Они находятся в файлах с расширением
*.a -
Использовать динамические библиотеки, которые подключаются во время рантайма приложения. Они находятся в файлах с расширением
*.so
Далее будут показаны способы сбора и подключения библиотек для всех вышеописанных способов на двух системах сборки - qmake и cmake
0. Создание библиотеки
Для примера сделаем одну и ту же библиотеку, содержащую единственную функцию, выводящую сумму двух чисел.
void print_add(int a, int b) {
qDebug() << a << " + " << b << " = " << a + b;
}
Далее нам нужны соответствующие файлы *.pro и CMakeLists.txt, которые будут конфигурировать соответственно qmake и cmake сборку соответственно.
Для qmake:
TEMPLATE = lib
TARGET = add
SOURCES += add.cpp \
HEADERS += add.h \
данный код соберёт динамическую библиотеку с файлом *.so. Чтобы собрать статическую, нужно после указания таргета приписать конфиг:
TEMPLATE = lib
TARGET = add
CONFIG += staticlib
SOURCES += add.cpp \
HEADERS += add.h \
Чтобы собрать под таргет, нужно зайти в Aurora IDE, сделать фиктивный spec файл в директории rpm и запустить сборку. Сборка упадёт, но библиотека соберётся и получим необходимое.
Далее то же самое, но для cmake:
cmake_minimum_required(VERSION 3.0)
project(add)
# Find the Qt5 package
find_package(Qt5 COMPONENTS Core REQUIRED)
# Add the source files to the executable
add_library(add STATIC
add.cpp
add.h
)
# Include the header files
target_include_directories(add PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)
# Link against the Qt5 libraries
target_link_libraries(add PRIVATE
Qt5::Core
)
Для динамической библиотеки заменить STATIC на SHARED
1. Сборка библиотеки
Есть два способа собрать библиотеку: через IDE и через терминал
1.1. Сборка через IDE
-
В случае
qmakeдостаточно написать фиктивный spec файл, в котором будет описание сборки rpm пакета. Запускаем сборку через IDE. Она провалится, т.к. в rpm загружать будет нечего, но библиотека соберётся. И мы получим желаемый*.aили*.soфайл. -
В случае
cmakeтакое не прокатит и нужно сделать шаблонное приложение, в котором соответственно эта библиотека будет подключена:
add_subdirectory(<директория библиотеки>)
1.2 Сборка через терминал
-
Сборка внутри определенного таргета производиться хитро. Заходим в docker/virtualbox по порту 2222 командой:
ssh -p 2222 -i /home/<пользователь>/AuroraOS/vmshare/ssh/private_keys/sdk mersdk@localhost
где /home/<пользователь>/AuroraOS - путь до директории установки Aurora SDK
-
Проверяем установленные таргеты:
sdk-assistant list -
Под обычным пользователем заходим внутрь таргета
как пользователь :
sb2 -t AuroraOS-4.0.2.303-base-armv7hl -m sdk-buildкак root:
sb2 -t "$target" -m sdk-install -R
Соответственно таргет AuroraOS-4.0.2.303-base-armv7hl меняем на нужный. Идём в каталог сборки и выполняем команды как будто собираем как на обычном линуксе.
-
Для
qmake:mkdir build cd build qmake .. makeлибо вызвать qmake конкретного таргета
qmake <название>.pro -
Для
cmake:mkdir build cd build cmake .. make
2. Подключение библиотеки в приложение
Разберём каждый из способов подключения библиотеки:
2.1. Сборка с исходниками
В таком случае можно просто скопировать файлы исходников библиотеки в проект и добавить их в таргет через add_executable или SOURCE += для cmake и qmake соответственно.
2.2 Сборка с исходниками (альтернатива)
Можно прямо во время сборки вызвать билд библиотеки и подключить её. Для этого используются следующие команды:
-
Для
cmake:add_subdirectory(<директория>)-для вызова сборки в поддиректории
target_include_directories(${PROJECT_NAME} PRIVATE <директория> )-для подключения заголовочных файлов из директории
target_link_libraries(${PROJECT_NAME} <название библиотеки> )-для линковки файла статической библиотеки
-
Для
qmake: