type
status
date
slug
summary
tags
category
icon
password
Property
Mar 23, 2023 01:10 PM
编译流程
- 安装 MSYS2
- MSYS2 (Minimal SYStem 2) 是⼀个 MSYS 的独⽴改写版本,主要⽤于 shell 命令⾏开发环境。同时它也是⼀个在 Cygwin (POSIX 兼容性层) 和 MinGW-w64 (从"MinGW-⽣成") 基础上产⽣的,追求更好的互操 作性的 Windows 软件。MSYS2 是 MSYS 的⼀个升级版,准确的说是集成了 Pacman 和 Mingw-64 的 Cygwin 升级版, 提供了 bash shell 等linux 环境、版本控制软件(git/hg)和 MinGW-w64 ⼯具链。与 MSYS最⼤的区别是移植了 Archlinux 的软件包管理系统 Pacman(其实是与Cygwin的区别)。
- 更新 MSYS2 环境:在 MSYS2 的安装目录下运行“MSYS2 MSYS”快捷方式,打开 MSYS2 终端,执行以下命令:
这将会更新MSYS2环境到最新版本
- 安装编译工具:在 MSYS2 终端中执行以下命令安装编译工具
- mingw-w64-x86_64-toolchain是一个针对64位Windows系统的MinGW-w64工具链,包含了一组用于开发和编译Windows应用程序的工具和库文件。它可以在64位Windows系统上生成本地可执行文件和库文件,兼容性较好,支持使用标准的C/C++语言编写代码。
- GCC编译器:支持C、C++等多种编程语言,可以将源代码编译成可执行文件和库文件。
- GNU Binutils工具:包括assembler、linker等多种工具,用于将编译后的代码转换成可执行文件和库文件。
- GNU Make:用于自动化编译过程,生成Makefile文件,简化编译流程。
- Windows API头文件和库文件:用于开发Windows应用程序,包括Win32 API、COM、OLE等。
- POSIX头文件和库文件:用于开发基于POSIX标准的应用程序。
- C Runtime库和C++ Standard库:提供了标准C和C++库函数,可以用于编写Windows应用程序。
mingw-w64-x86_64-toolchain主要包括以下工具和库文件:
- 安装依赖库:在MSYS2终端中执行以下命令安装FFmpeg的依赖库
- 下载 FFmpeg 源代码:在 FFmpeg 的官网下载需要编译的版本的源代码,并解压到本地文件夹
- 配置编译选项:在 MSYS2 终端中切换到 FFmpeg 源代码目录,执行以下命令进行配置:
- 编译为静态库:
- 编译为动态库:
--prefix
参数:指定编译好的文件将会被安装到的目录,默认库文件放在/usr/local/lib
目录下,头文件则会被安装到/usr/local/include
目录下。
这个命令将会配置FFmpeg的编译选项,其中--arch选项指定为x86_64表示编译64位版本,--target-os选项指定为mingw64表示编译Windows版本,--enable-shared选项表示编译为共享库,--disable-static选项表示禁用静态库。
- 编译源代码:在MSYS2终端中执行以下命令编译源代码:
- 以下是加快编译速度的几个方法:
- 使用多核编译:在编译大型项目时,可以使用多核编译来提高编译速度。可以在编译命令中使用“-j”参数,指定同时编译的进程数。例如,“make -j4”表示同时编译4个进程。
- 优化编译选项:可以通过优化编译选项来减少编译时间。例如,使用-O3优化选项可以提高编译后程序的性能,同时减少编译时间。
- 避免重新编译:在进行增量编译时,可以避免重新编译已经编译过的文件。可以使用make命令的“-c”参数来指定只编译修改过的文件,避免不必要的编译。
- 使用缓存:使用缓存可以避免重复编译。例如,使用ccache可以缓存编译过的对象文件和可执行文件,避免重复编译,提高编译速度。
- 禁用调试信息:在进行生产环境的编译时,可以禁用调试信息,以减少可执行文件的大小和编译时间。可以使用“-s”选项来禁用调试信息。
- 升级硬件:如果硬件配置较低,可以考虑升级硬件,例如增加内存或者更换更快的硬盘或SSD,以提高编译速度。
这个命令将会使用配置好的编译选项进行编译
总之,提高编译速度可以从多个方面入手,需要根据具体情况选择适合的方法。
- 安装编译好的库:在 MSYS2 终端中执行以下命令安装编译好的库:
这个命令将会将编译好的库安装到系统目录中
以上是在 Windows 下编译 64 位 Windows 版本的 FFmpeg 源代码的基本步骤,具体步骤可能因环境而异。在编译过程中,可能会遇到各种问题,需要根据错误提示进行相应的解决
补充知识
- 静态库、动态库、共享库:
- 静态库
- 动态库
- 共享库
静态库、动态库和共享库都是用于存放函数和变量等可重用代码的文件。它们在软件开发中扮演着重要的角色,可以提高代码的可重用性和可维护性。不同之处在于它们的链接方式、使用方式和特点等方面。
静态库是一种将函数和变量等可重用代码打包成一个单独的文件,与可执行文件进行链接的库文件。在编译时,编译器会将静态库中的函数和变量复制到可执行文件中,因此可执行文件中包含了所有所需的函数和变量。静态库的优点是链接速度快、使用简单、可靠性高,缺点是占用存储空间大,且每个可执行文件都需要包含一份完整的静态库代码,不便于更新和维护。
动态库是一种可以在程序运行时动态加载的库文件,由系统提供动态链接支持。在编译时,编译器只将函数和变量的声明打包到可执行文件中,而不包含实际的函数和变量实现。在程序运行时,操作系统会将所需的动态库加载到内存中,并将程序中的函数和变量指向动态库中的实际实现。动态库的优点是共享可重用代码,节省存储空间,方便更新和维护;缺点是使用稍微复杂,需要动态链接支持。
共享库是一种类似于动态库的库文件,可以被多个程序共享使用。共享库和动态库的区别在于,共享库使用了一种更为高效的动态链接方式,使得多个程序可以共享同一份库文件,减少了存储空间的占用。共享库的优点是更为高效、节省存储空间,多个程序可以共享同一份库文件,方便更新和维护;缺点是需要操作系统提供更强大的动态链接支持,使用略微复杂。
总体而言,静态库适用于小型应用程序和需要独立部署的程序,动态库适用于大型应用程序和需要共享可重用代码的程序,共享库则适用于需要多个程序共享同一份代码的程序。
- 如果是用 MSYS2 编译的动态库,链接时会依赖于 MSYS2 的 bin 文件夹中的某些动态库:
- 需要将
C:\msys64\mingw64\bin
这个目录添加到系统变量Path
中,这样使用时就能找到所依赖的 .dll,或者将mingw64\bin
下的文件放到项目的bin
目录下 - MSYS2编译的第三方库中,一些库的链接时会需要
msys-2.0.dll
,这是因为这些库依赖于MSYS2提供的一些系统库和工具。msys-2.0.dll
是MSYS2中的一个动态链接库,它包含了一些用于支持类Unix环境的系统调用、API接口和工具等。 - 当链接第三方库时,需要将这些库和所依赖的库一起打包成一个可执行文件或动态链接库。如果库中包含了对MSYS2提供的系统库和工具的调用,就需要将这些库和
msys-2.0.dll
一起链接到可执行文件或动态链接库中,否则程序将无法正常运行。因此,在编译和链接第三方库时需要确保msys-2.0.dll
已经正确安装并且可以被找到。 - 需要注意的是,如果需要在没有安装MSYS2的系统中运行可执行文件或动态链接库,需要将
msys-2.0.dll
和其它依赖的库一起打包到程序中,或者使用静态链接方式将库链接到程序中。
- 作者:OctalZero
- 链接:https://octalzero.com/article/ba081a15-0140-49ca-a3f0-af969fc03818
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章