Bash 这是一个静态构建吗?
首先,请原谅我对这个话题的无知——我对整体编译还不熟悉,远离程序员,我正在尝试理解静态版本与共享版本/库的概念 我已经修改了该指南,使用MinGW-W64工具链在Windows上运行,从源代码交叉编译x265项目。我试图使其成为静态构建,但当我这样做时:Bash 这是一个静态构建吗?,bash,cmake,compilation,static-libraries,cross-compiling,Bash,Cmake,Compilation,Static Libraries,Cross Compiling,首先,请原谅我对这个话题的无知——我对整体编译还不熟悉,远离程序员,我正在尝试理解静态版本与共享版本/库的概念 我已经修改了该指南,使用MinGW-W64工具链在Windows上运行,从源代码交叉编译x265项目。我试图使其成为静态构建,但当我这样做时: cd /ffmpeg_sources && if /cd x265 2> /dev/null; then hg pull && hg update && cd ..; else hg clo
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
文件之外,安装中至少还包含了三个其他文件,其中两个是库,我假设它们存在是因为可执行文件依赖它们。然而,我的印象一直是“static”=portable,它拥有较少的文件似乎并不令人满意
这就是创建静态构建时的意图吗?它不依赖.so
或.dll
文件,而只依赖.a
和.h
文件?或者我只是误解了我正在使用的Cmake开关,这个构建可以变得更加静态吗?正如它所说:
x265是一个H.265/HEVC视频编码器应用程序库,设计用于将视频或图像编码为H.265/HEVC编码的比特流
x265项目主要提供一个库,开发人员可以将其与应用程序链接
为他们提供x265、H.265/HEVC编码功能。其次,它提供了一个
对于H.265/HEVC,将输入文件编码为输出文件
因此,人们期望软件包安装能够提供-
图书馆
--安装:/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
检查
库包通常也会提供配置
切换到选择构建共享/动态库-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
.h
是一个源文件,最终程序不需要它来运行,只有编译器需要它来编译.dll
是windows上的动态/共享库.a
是Linux上的静态库。检查是否有帮助。@accountaryم但是如果可执行文件不需要运行.h
文件,为什么在编译包后由make install
创建和移动它?.a
/.h
或.lib
库的要求是否也意味着静态库,无论是在Linux还是Windows上,都与共享库一样可移植?这两个文件仍然必须一起分发,不是吗?是的,如果您只打算使用/运行x265.exe CLI程序,则可以删除.h
文件.h
编译时编译器(预处理器)只需要的文件。当您在代码中使用静态库(调用其中定义的函数)时,链接器会将二进制代码从静态库复制到最终的单个可执行文件中(这就是为什么称为“静态”的原因)因为当静态库的作者更改库的代码时,它不能在使用旧库编译的可执行文件中更改,而不使用新库重新编译),……但是如果它是动态库,链接器不会复制库的代码,而是在最终可执行文件中创建一个表,当操作系统加载可执行文件和动态库以运行最终可执行文件时,将填充该表。您需要.h
文件才能在代码中同时使用静态库和动态库(同样仅在编译时而不是运行时)。事实上,.h
文件是“启用库客户端编译”的构建时依赖项,.a
文件实际合并到可执行文件中,这意味着,如果我不打算做任何进一步的编译,它们可能会被删除,只提供.exe
?还是我误解了?我还注意到你在我的命令中没有提到-DBUILD\u SHARED\u LIBS=OFF
选项-这是否意味着这个选项在这里是多余的?@Hashim Hi。是的,如果您只需要x265可执行文件,您可以删除头文件(和pkg配置文件)。如果你再次链接