Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 这是一个静态构建吗?_Bash_Cmake_Compilation_Static Libraries_Cross Compiling - Fatal编程技术网

Bash 这是一个静态构建吗?

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

首先,请原谅我对这个话题的无知——我对整体编译还不熟悉,远离程序员,我正在尝试理解静态版本与共享版本/库的概念

我已经修改了该指南,使用MinGW-W64工具链在Windows上运行,从源代码交叉编译x265项目。我试图使其成为静态构建,但当我这样做时:

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配置文件)。如果你再次链接