Компонента настроена на статическую линковку всех зависимостей, включая Protocol Buffers. Это означает, что все необходимые библиотеки встроены в DLL/SO файл компоненты, и вам не нужно отдельно поставлять DLL protobuf.
-
Использование статических библиотек из vcpkg:
set(CMAKE_PREFIX_PATH "C:/Sources/vcpkg/installed/x64-windows-static")
Путь указывает на x64-windows-static - это статические сборки библиотек.
-
Флаги статической линковки:
set(Protobuf_USE_STATIC_LIBS ON) add_definitions("-DPROTOBUF_USE_DLLS=0")
-
Линковка зависимостей protobuf:
target_link_libraries(${TARGET} PRIVATE protobuf::libprotobuf) target_link_libraries(${TARGET} PRIVATE utf8_range::utf8_validity) target_link_libraries(${TARGET} PRIVATE absl::strings absl::status absl::statusor)
Windows:
vcpkg install protobuf --triplet x64-windows-static
vcpkg install abseil --triplet x64-windows-static
vcpkg install utf8-range --triplet x64-windows-staticLinux:
vcpkg install protobuf --triplet x64-linux-static
vcpkg install abseil --triplet x64-linux-static
vcpkg install utf8-range --triplet x64-linux-staticПосле сборки проверьте зависимости DLL:
dumpbin /DEPENDENTS SimpleKafka1C.dllВы НЕ должны увидеть в списке:
libprotobuf.dlllibabsl_*.dllutf8_range.dll
ldd SimpleKafka1C.so | grep protobufКоманда НЕ должна показывать libprotobuf.so в зависимостях.
При статической линковке protobuf размер DLL/SO файла увеличивается на ~2-3 МБ, так как весь код protobuf встраивается в компоненту. Это нормально и является компромиссом за удобство развертывания.
- Простота развертывания - нужен только один DLL/SO файл
- Нет конфликтов версий - не нужно беспокоиться о версии protobuf на целевой системе
- Изолированность - компонента полностью самодостаточна
- Совместимость - работает на любой системе без дополнительных зависимостей
- Размер файла - компонента больше по размеру
- Память - если на системе есть другие приложения с protobuf, код будет загружен дважды в память
- Обновления - для обновления protobuf нужно пересобрать всю компоненту
Если по каким-то причинам нужна динамическая линковка, измените CMakeLists.txt:
# Вместо x64-windows-static используйте x64-windows
set(CMAKE_PREFIX_PATH "C:/Sources/vcpkg/installed/x64-windows")
# Удалите или закомментируйте:
# set(Protobuf_USE_STATIC_LIBS ON)
# add_definitions("-DPROTOBUF_USE_DLLS=0")Тогда потребуется поставлять libprotobuf.dll вместе с компонентой.