第3章 x265编译与部署实战:源码编译、交叉编译、静态/动态链接、常见编译错误及解决方案
编译x265,说白了就是把一堆C++源码变成能在你机器上跑的可执行文件。听起来简单,但坑不少。我这些年踩过的坑,今天一次性给你讲清楚。
3.1 源码编译:从零开始
先说说最基础的本机编译。你拿到x265源码后,第一件事是跑cmake。我个人习惯用build目录隔离编译产物,干净利落。
git clone https://bitbucket.org/multicoreware/x265_git.git
cd x265_git/build/linux
./make-Makefiles.bash
make -j$(nproc)
sudo make install
这里有个细节:make-Makefiles.bash会调用cmake生成Makefile。如果你机器上有多个cmake版本,记得指定路径。我曾经因为系统自带cmake版本太老,编译出来编码器性能差了一大截。
cmake --version确认版本。x265要求cmake 3.0以上,但低于3.10会有一些选项不生效。我一般用3.15+。
3.2 交叉编译:给嵌入式设备准备的
做嵌入式开发的朋友,交叉编译是躲不过的。你想想看,你的开发机是x86_64,目标板是ARM,总不能把gcc搬到板子上编译吧?
交叉编译的关键在于工具链。我以ARM64为例:
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/arm-linux.cmake \
-DCMAKE_INSTALL_PREFIX=/opt/x265-arm64 \
-DENABLE_ASSEMBLY=OFF \
../../source
注意-DENABLE_ASSEMBLY=OFF。为什么关掉汇编优化?因为x265的汇编代码是x86_64的SIMD指令,ARM上用不了。强行打开会编译报错,而且报错信息特别隐晦——我第一次遇到时查了整整两天。
CMAKE_TOOLCHAIN_FILE路径必须用绝对路径或相对于source目录的路径。我曾经用相对路径,cmake死活找不到文件,最后发现是工作目录搞错了。
3.3 静态链接 vs 动态链接
这个问题,说白了就是「打包」和「引用」的区别。我做个表格对比一下:
| 特性 | 静态链接 | 动态链接 |
|---|---|---|
| 文件大小 | 大(所有依赖打包进去) | 小(运行时加载.so) |
| 部署复杂度 | 低(单文件拷贝) | 高(需要处理.so依赖) |
| 升级灵活性 | 差(重新编译整个程序) | 好(替换.so即可) |
| 性能 | 略好(省去动态加载开销) | 略差(有符号解析开销) |
我个人的建议是:生产环境用静态链接。为什么?因为动态链接的「.so地狱」太折磨人了。你想想看,部署到客户机器上,libstdc++.so.6版本不对,或者libpthread.so找不到,光排查依赖问题就能耗掉半天。
静态编译命令:
cmake -DENABLE_STATIC_LINK=ON -DENABLE_SHARED=OFF ../../source
make -j$(nproc)
3.4 常见编译错误及解决方案
编译x265时,错误信息五花八门。我挑几个高频的说说:
错误1:找不到nasm
CMake Error: Could not find nasm assembler
x265的汇编优化依赖nasm。安装即可:sudo apt install nasm。如果你不需要汇编优化,编译时加-DENABLE_ASSEMBLY=OFF。
错误2:YASM版本太旧
error: instruction 'vzeroupper' requires: AVX
yasm版本低于1.3.0不支持AVX指令集。升级yasm,或者换用nasm。我建议直接装nasm,省心。
错误3:链接时undefined reference
undefined reference to `pthread_create'
这是链接器没找到pthread库。cmake时加-DCMAKE_EXE_LINKER_FLAGS="-lpthread"。或者手动修改CMakeLists.txt,在target_link_libraries里加上pthread。
错误4:内存不足导致编译中断
c++: fatal error: Killed signal terminated program cc1plus
编译x265很吃内存,特别是多线程编译时。我遇到过一台4GB内存的机器,make -j4直接OOM。解决方案:减少并行任务数,make -j2或者make -j1。或者加swap空间。
free -h看看内存。如果小于8GB,建议make -j2。别贪快,编译到一半崩了更浪费时间。
3.5 知识体系:编译部署全流程
下面这张图,是我自己梳理的x265编译部署知识体系。你对照着看,心里就有谱了。
3.6 部署后的验证
编译完别急着收工。我每次都会跑几个验证步骤:
- 检查版本信息:
./x265 --version,确认编译选项是否生效。 - 编码测试:拿一个短YUV文件编码,看输出是否正常。
- 性能摸底:
time ./x265 --input test.yuv --output test.h265 --preset medium,记录编码耗时。
好了,编译部署这块就这些。你按这个流程走,基本不会出大问题。如果遇到奇怪的编译错误,先看错误日志的前几行——真正的病因往往在最上面。