Подключение библиотек в приложениях на ОС Аврора

Существует три основных способа подключения любой библиотеки:

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

  2. Использовать статические библиотеки, которые компонуются во время компиляции приложения. Они находятся в файлах с расширением *.a

  3. Использовать динамические библиотеки, которые подключаются во время рантайма приложения. Они находятся в файлах с расширением *.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 Сборка через терминал

  1. Сборка внутри определенного таргета производиться хитро. Заходим в docker/virtualbox по порту 2222 командой:

    ssh -p 2222 -i /home/<пользователь>/AuroraOS/vmshare/ssh/private_keys/sdk mersdk@localhost

где /home/<пользователь>/AuroraOS - путь до директории установки Aurora SDK

  1. Проверяем установленные таргеты:

    sdk-assistant list
  2. Под обычным пользователем заходим внутрь таргета

    как пользователь :

    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: