mark:x264编译选项

博客详细介绍编译命令行,包含参数列表及理解,给出编译命令行示例以提高性能。还展示了实测的gcc和nasm编译选项,最后说明在某些环境下减少可执行文件大小的编译优化选项,如去掉 -g、开启 O3 等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、编译命令行详解

  • 命令行参数列表

                             

  • 命令行参数理解
参数名参数说明备注
extra-asflags汇编编译选项参数
extra-cflagsgcc编译选项参数微软编译选项
extra-ldflags链接外部库使用
extra-rcflags
disable-clidisable cli正式版本可以关闭该项。禁止命令行操作。
system-libx264use system libx264 instead of internal
enable-sharedbuild shared library
enable-staticbuild static library
disable-opencldisable OpenCL features
disable-gpldisable GPL-only features商用版本注意GPL license,使用该功能,自研优化代码需要开源。
disable-threaddisable multithreaded encoding
disable-win32threaddisable win32threads (windows only)
disable-interlaceddisable interlaced encoding support是否禁止支持场编码
bit-depthset output bit depth (8, 10, all) [all]若使用10,要求YUV数据就是10bit。
chroma-formatoutput chroma format (400, 420, 422, 444, all) [all]
disable-asmdisable platform-specific assembly optimizationslinux下要安装yasm、windows下安装nasm才能使能该功能。
enable-ltoenable link-time optimization自动寻找可优化函数,进行内联优化等
enable-debugadd -g
enable-gprofadd -pg
enable-stripadd -s
enable-picbuild position-independent code地址无关代码 (position-independent code,PIC),又称地址无关可执行文件 (position-independent executable,PIE) ,是指可在主存储器中任意位置正确地运行,而不受其绝对地址影响的一种机器码。PIC广泛使用于共享库,使得同一个库中的代码能够被加载到不同进程的地址空间中。PIC还用于缺少内存管理单元的计算机系统中,使得操作系统能够在单一的地址空间中将不同的运行程序隔离开来。
disable-avsdisable avisynth support视频后处理工具。参见:AviSynth
disable-swscaledisable swscale support用于视频缩放处理。
disable-lavfdisable libavformat support直接调用ffmpeg库,解析输入文件为YUV。
disable-ffmsdisable ffmpegsource supportFFmpegSource2(FFMS2)是 Libav/FFmpeg 的封装库,解析输入文件为YUV。
disable-gpacdisable gpac support参见《GPCA
disable-lsmashdisable lsmash support参见《lsmash

二、编译命令行示例

关闭一些不使用的编译选项,减少不必要的代码分支判断,提高性能。

./configure --disable-avs --disable-swscale --disable-lavf --disable-ffms --disable-interlaced --enable-shared --enable-lto --bit-depth=8 --chroma-format=420 --extra-ldflags=-Wl,--output-def=libx264.def

                                    

三、实测gcc编译选项

gcc -Wno-maybe-uninitialized -Wshadow -O3 -ffast-math -m64  -Wall -I. -I. -D_POSIX_C_SOURCE=200112L -std=gnu99 -D_GNU_SOURCE -fomit-frame-pointer -flto -fno-tree-vectorize

四、实测nasm编译选项

nasm -I. -I. -DARCH_X86_64=1 -I./common/x86/ -f win64 -DSTACK_ALIGNMENT=16 -DPIC

nasm官网:https://www.nasm.us/

五、备注说明

在某些环境下,对可执行文件的大小会有些限制,为减少可执行文件的size,可以编译的优化选项有:

1、去掉-g

2、开启O3

3、开启strip

4、开启ar -x,过滤不需要的.a(eg:有个.a,程序链接了它,但没有使用任何符号,这个.a 就不会出现在可执行文件里)

5、全局变量不要初始化,让他在bss区

<think>我们参考了引用[1]和引用[3]的内容,特别是引用[3]中提供了CoreMark在MIPS架构上交叉编译的修改示例。用户的需求是在Linux环境下进行CoreMark的交叉编译。以下是详细步骤: ### 1. 准备交叉编译工具链 根据目标架构(如ARM64、MIPS等)安装对应的交叉编译工具链。例如: - **ARM64架构**:`aarch64-linux-gnu-gcc` - **MIPS架构**:`mips64el-linux-gcc`(如引用[3]所示) 安装方法(以Ubuntu为例): ```bash # 安装ARM64交叉编译器 sudo apt install gcc-aarch64-linux-gnu # 安装MIPS交叉编译器 sudo apt install gcc-mips64el-linux-gnuabi64 ``` ### 2. 下载CoreMark源码 从[EEMBC官网](https://www.eembc.org/coremark/)下载CoreMark源码(当前最新版本为v1.0.1): ```bash wget https://www.eembc.org/coremark/coremark_v1.0.1.tgz tar xzf coremark_v1.0.1.tgz cd coremark_v1.0.1 ``` ### 3. 修改配置文件 进入与目标架构对应的目录(如`linux64`、`arm`等),修改`core_portme.mak`文件。以**ARM64**为例: ```bash cd linux64 vim core_portme.mak ``` 修改关键编译参数(参考引用[3]的做法): ```makefile # 修改编译器为交叉编译器 CC = aarch64-linux-gnu-gcc # 添加静态链接选项(可选,避免动态库依赖问题) CFLAGS += -static # 其他优化选项(根据需求调整) # 例如:-O2 -DMULTITHREAD=4 -DUSE_PTHREAD ``` ### 4. 执行编译 在修改后的目录下运行: ```bash make ``` 生成的可执行文件为`coremark.exe`(实际是Linux可执行文件,可重命名)。 ### 5. 验证文件架构 使用`file`命令确认生成的是目标架构程序: ```bash file coremark.exe # 期望输出:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked... ``` ### 6. 传输到目标设备 使用`scp`复制到ARM64设备: ```bash scp coremark.exe user@arm64_device:/path/ ``` ### 7. 在目标设备运行 登录目标设备执行: ```bash chmod +x coremark.exe ./coremark.exe ``` ### 关键参数说明 | 编译宏 | 作用 | 示例 | |--------|------|------| | `-DPERFORMANCE_RUN=1` | 性能模式(默认) | 运行次数增加 | | `-DVALIDATION_RUN=1` | 验证模式 | 检查结果正确性 | | `-DMULTITHREAD=N` | 多线程数 | `-DMULTITHREAD=4` | | `-DUSE_FORK=1` | 使用fork创建进程 | 需POSIX支持 | | `-DUSE_PTHREAD=1` | 使用pthread线程 | 推荐方式 | > **注意**:静态编译(`-static`)可避免目标设备缺少库的问题,但会增加文件大小[^1]。 ### 常见问题解决 1. **编译错误:未找到头文件** 安装目标架构的C库头文件(以ARM64为例): ```bash sudo apt install linux-libc-dev-arm64-cross ``` 2. **运行时报错:非法指令** 检查目标CPU支持的指令集,在`CFLAGS`中添加`-march=`参数(如`-march=armv8-a`)。 3. **多线程支持问题** 确保启用`-DUSE_PTHREAD`并链接线程库: ```makefile CFLAGS += -pthread ``` ### 性能优化建议 - 开启编译器最高优化级别:`-O3` - 根据CPU特性添加指令集扩展参数(如Neon SIMD:`-march=armv8.2-a+simd`) - 关闭调试信息:`-s -Wl,--strip-all` §§相关问题§§ 1. 如何为不同的ARMv8处理器定制优化CoreMark编译参数? 2. CoreMark多线程测试中如何避免线程调度带来的性能波动? 3. 交叉编译时如何生成CoreMark的火焰图用于性能分析? 4. 在嵌入式设备上运行CoreMark需要哪些最小系统依赖? [^1]: 静态链接会将所有依赖库打包进可执行文件,适用于缺少动态库的环境</think>### Linux 下 CoreMark 交叉编译指南 根据引用[1]和引用[3]的内容,CoreMark 交叉编译需要以下关键步骤: #### 1. **准备交叉编译工具链** - 安装目标架构的交叉编译器(以 ARM64 为例): ```bash sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu ``` - 验证工具链: ```bash aarch64-linux-gnu-gcc --version ``` #### 2. **获取 CoreMark 源码** ```bash wget https://github.com/eembc/coremark/archive/refs/tags/v1.0.1.tar.gz tar -xzvf v1.0.1.tar.gz cd coremark-1.0.1 ``` #### 3. **修改编译配置文件** 参考引用[3]的修改方法,编辑 `linux64/core_portme.mak`: ```makefile # 原始配置 # CC = gcc # 修改为交叉编译器 CC = aarch64-linux-gnu-gcc # 添加静态链接选项(避免动态库依赖问题) CFLAGS += -static # 添加架构优化参数(根据目标CPU特性) CFLAGS += -march=armv8-a+crc -mtune=cortex-a72 ``` #### 4. **执行交叉编译** ```bash make PORT_DIR=linux64 ``` 生成的可执行文件 `coremark.exe` 即为 ARM64 架构程序 #### 5. **验证目标文件** ```bash file coremark.exe # 期望输出:ELF 64-bit LSB executable, ARM aarch64... ``` #### 6. **传输到目标设备** ```bash scp coremark.exe user@arm64_device:/path/to/run ``` #### 7. **在目标设备运行** ```bash # 登录ARM64设备 ssh user@arm64_device # 执行测试 cd /path/to/run chmod +x coremark.exe ./coremark.exe ``` ### 关键配置说明 | **编译选项** | **作用** | **推荐值** | |--------------|----------|------------| | `-DMULTITHREAD=N` | 设置线程数 | 根据核心数设置(如4核填4) | | `-DUSE_PTHREAD` | 启用POSIX线程 | 必须添加 | | `-O3` | 最高优化级别 | 性能测试必选 | | `-static` | 静态链接 | 避免依赖库问题[^1] | | `-march=` | 目标架构特性 | 如 `armv8.2-a+simd` | ### 常见问题解决 1. **链接错误:缺少库** ```bash # 安装目标架构标准库 sudo apt install libc6-dev-arm64-cross ``` 2. **非法指令错误** ```bash # 检查目标CPU支持的特性 cat /proc/cpuinfo | grep Features # 修改编译参数匹配特性 CFLAGS += -mcpu=cortex-a53 ``` 3. **多线程支持问题** ```makefile # 确保添加线程支持 CFLAGS += -pthread LDFLAGS += -lpthread ``` ### 性能优化技巧 1. **CPU特性利用** ```makefile # 启用Neon指令集 CFLAGS += -mfloat-abi=hard -mfpu=neon ``` 2. **内存对齐优化** ```c // 在core_portme.c中添加 #define COMPILER_FLAGS "-DAUTO_DATA_ALIGNMENT" ``` 3. **大页内存支持** ```bash # 目标设备执行 sudo hugeadm --create-global-mounts ``` > **注意**:测试结果需包含 `Iterations/Sec` 和 `CoreMark/MHz` 指标,完整运行应输出: > ``` > 2K performance run parameters for coremark. > CoreMark 1.0 : 4.000000 / gcc 9.4.0 -O3 -DMULTITHREAD=4 ... > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值