bash - 这是静态构建吗?
问题描述
首先,请原谅我对这个话题的无知——我是一个整体编译的新手,远离程序员,我试图理解静态与共享构建/库的概念。
我已经修改了此处的指南,使用 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
...它创建结果文件:
-- 安装:/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
or.dll
文件,而是仅依赖.a
and.h
文件?或者我只是误解了我正在使用的 Cmake 开关,这个构建可以变得更加静态吗?
解决方案
正如其登陆页面所说:
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
查看。
为开发人员提供包的编译和链接元数据的文件。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
具有构建时依赖关系 - 就像任何其他需要与libx265
. 但是由于它已经与静态库
链接,可执行文件一旦构建,就物理地合并了它所依赖的libx265.a
所有部分,
并且对其没有运行时依赖;事实上,对静态库的运行时依赖是绝对不可能的。libx265.a
此外,由于您指定:
-DCMAKE_EXE_LINKER_FLAGS="-static"
您的可执行文件的链接是完全静态的,即链接器将不得不找到并链接链接所需的每个库的静态版本,而不是共享版本,而不仅仅是libx265
,并且根据发布的证据表明它成功了。
底线:您的安装似乎完全按照应有的方式进行,并且您拥有一个完全静态的可执行文件x265.exe
。
推荐阅读
- javascript - 无法使用 jQuery AJAX 发送多个数据参数
- python - 将显示凯撒密码字典的 Python 函数
- python - 如何以生产者-消费者模式等待和检索结果?
- php - Android应用程序的Wordpress身份验证
- stored-procedures - 我可以使用 postgres JDBC 驱动程序从 java 调用 postgres“过程”(而不是“函数”)吗?
- java - Java 有(显然)矛盾的作用域
- selenium - 从搜索下拉列表中选择值在硒中不起作用
- regex - Dreamweaver 正则表达式将 id 与 YUI 格式匹配
- sql-server - 多个重复的 IF 语句与存储过程中带有循环的单个 IF
- graph - 接口上的 SNMP/mrtg/流量报告不正确