Это статическая сборка? - PullRequest
1 голос
/ 19 марта 2019

Во-первых, прости меня за мое незнание в этой теме - я новичок в компиляции в целом и далек от программиста, и я пытаюсь понять концепцию статических сборок / библиотек с общим доступом.

Я адаптировал руководство здесь для кросс-компиляции проекта x265 из исходного кода, используя набор инструментов MinGW-W64 для запуска в Windows. Я пытаюсь сделать статическую сборку, но когда я делаю:

cd /ffmpeg_sources && if /cd x265 2> /dev/null; then hg pull && hg update && cd ..; else hg clone https://bitbucket.org/multicoreware/x265; fi &&
cd x265/build/linux && PKG_CONFIG_PATH="/usr/local/lib/pkgconfig" \
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/usr/local" -DENABLE_SHARED=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_EXE_LINKER_FLAGS="-static" ../../source \
-DCMAKE_TOOLCHAIN_FILE="/ffmpeg_sources/x265/build/msys/toolchain-x86_64-w64-mingw32.cmake" &&
make -j$(nproc) &&
make install

... создает результирующие файлы:

- Установка: /usr/local/lib/libx265.a
- Установка: /usr/local/include/x265.h
- Установка: /usr/local/include/x265_config.h
- Установка: /usr/local/lib/pkgconfig/x265.pc
- Установка: /usr/local/bin/x265.exe

Помимо файла .exe, в состав установки входят, по крайней мере, три других файла, два из которых являются библиотеками, и я предполагаю, что они там, потому что на них полагается исполняемый файл. Тем не менее, у меня всегда было впечатление, что «статический» = переносимый, что, имея несколько файлов меньше, кажется, не удовлетворяет.

Это то, что предназначено при создании статической сборки - что вместо использования файлов .so или .dll он будет полагаться только на файлы .a и .h? Или я просто неправильно понимаю переключатели Cmake, которые я использую, и можно ли сделать эту сборку еще более статичной?

1 Ответ

2 голосов
/ 19 марта 2019

Как указано на целевой странице :

x265 - это прикладная библиотека видеокодера H.265 / HEVC, предназначенная для кодирования видео или изображений в кодированный битовый поток H.265 / HEVC.

проект x265 в основном предоставляет библиотеку , которую разработчики могут связать со своими приложениями предоставить им функциональность кодирования x265, H.265 / HEVC. Во-вторых, он предоставляет инструмент командной строки , x265 для кодирования H.265 / HEVC входного файла в выходной файл.

Следовательно, можно ожидать, что установка пакета обеспечит -

Библиотека

- Установка: /usr/local/lib/libx265.a

Проверьте.

Один или несколько заголовочных файлов, позволяющих компилировать клиентов библиотеки

- Установка: /usr/local/include/x265.h

- Установка: /usr/local/include/x265_config.h

Проверьте.

A pkg-config файл для предоставления разработчики с метаданными компиляции и связывания пакета.

- Установка: /usr/local/lib/pkgconfig/x265.pc

Проверьте.

Инструмент командной строки

- Установка: /usr/local/bin/x265.exe

Проверьте.

Было бы также обычно для пакета библиотеки предлагать конфигурацию переключиться на выбор построения общей / динамической библиотеки - libname.so (Windows: [lib]name.dll) - или статическая библиотека - libname.a (Windows: [lib]name.(a|lib)) - по умолчанию на общий доступ.

Вы выбрали статическую сборку:

DENABLE_SHARED=OFF

и соответственно получили только статическую библиотеку libx265.a. Ваш исполняемый файл командной строки x265.exe имеет зависимость buildtime от этой библиотеки и его заголовочные файлы - так же, как и любое другое приложение, которое требует связь с libx265. Но так как он был связан с static библиотекой libx265.a, исполняемый файл, когда-то построенный, физически включает в себя все части libx265.a от которого зависит и не имеет runtime зависимости от него; в самом деле, Зависимость во время выполнения от статической библиотеки категорически невозможна.

Кроме того, поскольку вы указали:

-DCMAKE_EXE_LINKER_FLAGS="-static"

Связывание вашего исполняемого файла было полностью статическим, то есть компоновщик был обязан найти и связать статическую, не разделяемую версию каждой библиотеки, требуемой для связывания, не просто libx265, а по опубликованным доказательствам это удалось.

Итог: ваша установка прошла точно так, как должна, и у вас полностью статический исполняемый файл x265.exe.

...