Сборка динамических библиотек

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

Чтобы выполнить сборку динамической библиотеки, нужно использовать следующую CMake-команду:

add_library(<имя цели сборки> SHARED [список путей к файлам исходного кода библиотеки])

При использовании этой CMake-команды возникает ошибка, если тулчейн не поддерживает динамическую компоновку.

Также можно выполнить сборку динамической библиотеки следующей CMake-командой:

add_library(<имя цели сборки> [список путей к файлам исходного кода библиотеки])

При этом shell-команду cmake нужно вызвать с параметром -D BUILD_SHARED_LIBS=YES. (Если вызвать shell-команду cmake без параметра -D BUILD_SHARED_LIBS=YES, будет выполнена сборка статической библиотеки.)

Пример:

#!/bin/bash

...

cmake -G "Unix Makefiles" \

-D CMAKE_BUILD_TYPE:STRING=Debug \

-D CMAKE_TOOLCHAIN_FILE=$SDK_PREFIX/toolchain/share/toolchain-$TARGET.cmake \

-D BUILD_SHARED_LIBS=YES \

-B build \

&& cmake --build build --target kos-image

По умолчанию имя файла библиотеки совпадает с именем цели сборки, заданным через параметр CMake-команды add_library(). Имя файла библиотеки можно изменить, используя CMake-команду set_target_properties(). Это можно использовать, чтобы имя файла библиотеки было одинаковым для ее динамического и статического варианта.

Пример:

# Сборка статической библиотеки

add_library(somelib_static STATIC src/somesrc.cpp)

set_target_properties(somelib_static PROPERTIES OUTPUT_NAME "somelib")

# Переменная PLATFORM_SUPPORTS_DYNAMIC_LINKING имеет

# значение "истина", если используется динамическая

# компоновка. Если вызывается initialize_platform(FORCE_STATIC),

# эта переменная имеет значение "ложь".

if(PLATFORM_SUPPORTS_DYNAMIC_LINKING)

# Сборка динамической библиотеки

add_library(somelib_shared SHARED src/somesrc.cpp)

set_target_properties(somelib_shared PROPERTIES OUTPUT_NAME "somelib")

endif()

Динамическая библиотека может быть скомпонована с другими статическими и динамическими библиотеками CMake-командой target_link_libraries(). При этом статические библиотеки должны быть собраны с флагом -fPIC. Этот флаг применяется при сборке статической библиотеки, если используется следующая CMake-команда:

set_property(TARGET <список имен целей сборки> PROPERTY POSITION_INDEPENDENT_CODE ON)

В начало