编译AV1编码器libaom的记录

起始编译过程

pthread.h文件

提示缺失pthread.h文件

1
Looking for pthread.h - not found

根据教程https://blog.csdn.net/qianchenglenger/article/details/16907821,在windows下配置pthread。

下载pthreads-w32-2-9-1-release.zip,由于年久失修,需要在镜像站下载
https://sourceware.org/mirrors.html->https://mirrors.kernel.org/sourceware/pthreads-win32/

具体操作只涉及/Pre-built.2中的文件。

1.将/Pre-built.2/include/Pre-built.2/lib的文件分别放入VS 2019的对应文件夹下。

2.将/Pre-built.2/dll/x64/x86的文件分别放入system32SysWOW64中。

再次pthread.h文件

但完成上述操作后,仍找不到pthread.h文件

虽然命令行终端中显示的报错内容与之前一致,但在Error.log中,增加了一行报错信息。

1
...\pthread.h error C2011:  'timespec': 'struct' type redefinition ...

通过这个报错信息可知,我们上一步向VS 2019中添加头文件等操作是起了作用的,虽然终端上仍说找不到pthread.h文件,但报错信息表明cmake已经找到了pthread.h文件。

pthread.h文件内添加

1
2
#define HAVE_STRUCT_TIMESPEC 
// add by https://blog.csdn.net/user11223344abc/article/details/80536809

后,终于能找到pthread.h文件

1
Looking for pthread.h - found

但又出现新的问题。

终端下

1
2
3
4
5
6
7
8
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - not found
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - no

Error.log

1
cannot open file 'pthreads.lib' 

把放入系统内存的dll重新向tools下的bin文件夹放了一份,但不起作用,同样的报错。

https://github.com/tensorflow/tensorflow/issues/5576,有人说把Cmakelist.txt中的

1
find_package (Threads)

注释掉,因为在Windows下根本不需要pthreads。

但我试着单独注释掉上面那句话、注释掉整个if块,都不成功,仍得到同样的报错。

Linux下的结果

在CentOS 7.6 虚拟机下编译

1
2
cd "aom的上级目录"
cmake aom

同样报错

1
2
3
4
5
6
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found

日志文件中

1
cannot find -lpthreads

(其实在完成上述操作后,编译环境的铺垫已经完成。)

VS模式编译

源码编译

1
2
cd "aom上级目录"
cmake aom -DAOM_TARGET_CPU=generic

使用以下两个命令编译,都不成功,而控制台输出不一致。

1
2
cd "aom上级目录"
cmake aom
1
2
cd aom
cmake ../aom

正确而优雅的编译方式,在/aom所在目录下新建/aom_build,执行以下命令。

1
cmake ../aom -DAOM_TARGET_CPU=generic

至此,cmake步骤完成,生成包含aom.sln解决方法在内的VS项目。

由sln到exe

在VS中(将语言调整为中文Orz…,)设置好release模式后,开始build,以生成可执行的exe文件。

报错信息如下

1
2
aom_build\aom_av1_common.vcxproj : error MSB4014: 生成已意外停止,因为发生内部故障。
aom_build\aom_av1_common.vcxproj : error MSB4014: System.Text.EncoderFallbackException: 无法将位于索引 1646 处的 Unicode 字符 \uDD62 转换为指定的代码页。

在将系统内部语言(非显示语言)更改为英语并重新编译源码后,仍是同样的报错。

(检查了其他报错文件,一样的报错)

好吧,专心去解决这个索引1646是什么鬼。

安装VS的桌面版工程组件

虽然这个听上去是必要的,但装上后仍没什么用,一样的报错。

安装工具

没有装perl和Doxygen,前者必须,后者可选。

但装完后,除了在编译完成后能找到Doxygen,VS中多了一个要处理的文件和索引位置延后之外,本质上与之前无区别。

关于GCC

期间安装了GCC,并将MinGW-make.exe改名为make.exe(据说是防止cmake找不到);而之前安装的GnuWin32,其bin也叫make.exe,为了防止冲突,又将GnuWin32从环境变量中删去。

上述操作的一个结果是,在编译aom的doc时,提示缺少dot(但控制台只是提了一下,无waring和error,而且在后续用命令行成功编译exe后,同时编译出的doc也能正常打开(html的doc,而tex的还没看))。

命令行编译

参考https://blog.csdn.net/u014426939/article/details/80080635

生成Cache

1
2
cd build
cmake ../aom -DAOM_TARGET_CPU=generic

生成exe

1
2
cd build
cmake --build ./ --config Release

相应exe文件在/build/Release中。