Для сборки динамических библиотек требуется использовать тулчейн, который поддерживает динамическую компоновку.
Чтобы выполнить сборку динамической библиотеки, нужно использовать следующую 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)
В начало