这是静态构建吗?
Is this a static build?
首先,请原谅我对这个话题的无知 - 我是整体编译的新手,与程序员相去甚远,我正在尝试理解静态与共享的概念 builds/libraries。
我已经改编了指南 here,使用 MinGW-W64 工具链从源代码交叉编译 x265 项目到 运行 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
...它创建结果文件:
-- Installing: /usr/local/lib/libx265.a
-- Installing: /usr/local/include/x265.h
-- Installing: /usr/local/include/x265_config.h
-- Installing: /usr/local/lib/pkgconfig/x265.pc
-- Installing: /usr/local/bin/x265.exe
除了 .exe
文件之外,安装中至少包含三个其他文件,其中两个是库,我假设它们存在是因为它们依赖于由可执行文件。不过我的印象一直是"static" = portable,少了几个文件好像不太满足。
这是创建静态构建时的目的吗 - 它不依赖于 .so
或 .dll
文件,而是仅依赖于 .a
和 .h
文件?或者我只是误解了我正在使用的 Cmake 开关,这个构建可以变得更加静态吗?
正如其 landing page 所说:
x265 is a H.265 / HEVC video encoder application library, designed to encode video or images into an H.265 / HEVC encoded bitstream.
x265 项目主要提供一个 库 开发人员可以 link 使用他们的应用程序
为他们提供 x265、H.265/HEVC 编码功能。其次,它提供了 commandline tool, x265
用于输入文件到输出文件的 H.265/HEVC 编码。
因此,人们希望软件包安装提供 -
图书馆
-- Installing: /usr/local/lib/libx265.a
检查。
一个或多个启用库客户端编译的头文件
-- Installing: /usr/local/include/x265.h
-- Installing: /usr/local/include/x265_config.h
检查。
Apkg-config
文件提供
开发人员提供包的编译和 linkage 元数据。
-- Installing: /usr/local/lib/pkgconfig/x265.pc
检查。
命令行工具
-- Installing: /usr/local/bin/x265.exe
检查。
库包提供配置也很常见
切换到 select 构建 shared/dynamic 图书馆 - libname.so
(Windows: [lib]name.dll
)
- 或静态库 - libname.a
(Windows: [lib]name.(a|lib)
) - 默认
分享。
您选择了静态构建:
DENABLE_SHARED=OFF
并相应地得到了静态库 libx265.a
。您的
命令行可执行文件 x265.exe
对该库有 buildtime 依赖
及其头文件——就像任何其他需要的应用程序一样
link年龄 libx265
。但是因为它已经用 static 库 linked
libx265.a
,可执行文件一旦构建,就会在物理上包含
libx265.a
它依赖并且没有 runtime 依赖;的确,
对 static library 的运行时依赖是绝对不可能的。
此外,由于您指定:
-DCMAKE_EXE_LINKER_FLAGS="-static"
您的可执行文件的 linkage 是 完全 静态的,即 linker 将不得不找到并 link link年龄需要的 每个 库的静态、非共享版本,而不仅仅是 libx265
,根据发布的证据,它成功了。
底线:您的安装似乎完全按照预期进行,并且您有一个完全静态的可执行文件 x265.exe
。
首先,请原谅我对这个话题的无知 - 我是整体编译的新手,与程序员相去甚远,我正在尝试理解静态与共享的概念 builds/libraries。
我已经改编了指南 here,使用 MinGW-W64 工具链从源代码交叉编译 x265 项目到 运行 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
...它创建结果文件:
-- Installing: /usr/local/lib/libx265.a
-- Installing: /usr/local/include/x265.h
-- Installing: /usr/local/include/x265_config.h
-- Installing: /usr/local/lib/pkgconfig/x265.pc
-- Installing: /usr/local/bin/x265.exe
除了 .exe
文件之外,安装中至少包含三个其他文件,其中两个是库,我假设它们存在是因为它们依赖于由可执行文件。不过我的印象一直是"static" = portable,少了几个文件好像不太满足。
这是创建静态构建时的目的吗 - 它不依赖于 .so
或 .dll
文件,而是仅依赖于 .a
和 .h
文件?或者我只是误解了我正在使用的 Cmake 开关,这个构建可以变得更加静态吗?
正如其 landing page 所说:
x265 is a H.265 / HEVC video encoder application library, designed to encode video or images into an H.265 / HEVC encoded bitstream.
x265 项目主要提供一个 库 开发人员可以 link 使用他们的应用程序 为他们提供 x265、H.265/HEVC 编码功能。其次,它提供了 commandline tool, x265 用于输入文件到输出文件的 H.265/HEVC 编码。
因此,人们希望软件包安装提供 -
图书馆
-- Installing: /usr/local/lib/libx265.a
检查。
一个或多个启用库客户端编译的头文件
-- Installing: /usr/local/include/x265.h
-- Installing: /usr/local/include/x265_config.h
检查。
Apkg-config
文件提供
开发人员提供包的编译和 linkage 元数据。
-- Installing: /usr/local/lib/pkgconfig/x265.pc
检查。
命令行工具
-- Installing: /usr/local/bin/x265.exe
检查。
库包提供配置也很常见
切换到 select 构建 shared/dynamic 图书馆 - libname.so
(Windows: [lib]name.dll
)
- 或静态库 - libname.a
(Windows: [lib]name.(a|lib)
) - 默认
分享。
您选择了静态构建:
DENABLE_SHARED=OFF
并相应地得到了静态库 libx265.a
。您的
命令行可执行文件 x265.exe
对该库有 buildtime 依赖
及其头文件——就像任何其他需要的应用程序一样
link年龄 libx265
。但是因为它已经用 static 库 linked
libx265.a
,可执行文件一旦构建,就会在物理上包含
libx265.a
它依赖并且没有 runtime 依赖;的确,
对 static library 的运行时依赖是绝对不可能的。
此外,由于您指定:
-DCMAKE_EXE_LINKER_FLAGS="-static"
您的可执行文件的 linkage 是 完全 静态的,即 linker 将不得不找到并 link link年龄需要的 每个 库的静态、非共享版本,而不仅仅是 libx265
,根据发布的证据,它成功了。
底线:您的安装似乎完全按照预期进行,并且您有一个完全静态的可执行文件 x265.exe
。