x264项目编译

Posted

技术标签:

【中文标题】x264项目编译【英文标题】:Compilation of x264 project 【发布时间】:2016-06-11 00:28:20 【问题描述】:

我已经下载了source of x264 library。

x264的版本是148。

对于共享 dll 的编译,我使用以下命令 MSYS 环境:

./configure --disable-cli --enable-shared --prefix=.

结果如下:

platform:      X86_64
byte order:    little-endian
system:        WINDOWS
cli:           no
libx264:       internal
shared:        yes
static:        no
asm:           yes
interlaced:    yes
avs:           no
lavf:          no
ffms:          no
mp4:           no
gpl:           yes
thread:        win32
opencl:        yes
filters:       crop select_every
debug:         no
gprof:         no
strip:         no
PIC:           yes
bit depth:     8
chroma format: all

执行make后出现以下错误:

common/win32thread.o:win32thread.c:(.text+0x60): undefined reference to `_beginthreadex'
common/win32thread.o:win32thread.c:(.text+0x60): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_beginthreadex'
collect2: error: ld returned 1 exit status
Makefile:192: recipe for target 'libx264-148.dll' failed
make: *** [libx264-148.dll] Error 1

我的工作环境:

    Windows 10 专业版 MSYS64 和 mingw64 Microsoft Visual Studio 2015

configure 命令执行没有错误,但是 make 给了我上面描述的错误。

【问题讨论】:

很奇怪。 process.h 是WinGW 的一部分。你可以试试make -D__MSVCRT__ 尊敬的蒂姆先生,非常感谢您的回答。目标是在 GCC 环境中构建 DLL。选项 make -D__MSVCRT__ 与 MSVC 环境有关。命令 $ make -D__MSVCRT__ 给出错误 make: invalid option -- D make: invalid option -- _ make: invalid option -- _ make: invalid option -- M make: invalid option -- V 用法:make [options] [目标] ... 【参考方案1】:

GCC 由 MSYS2/MinGW 构建,具有不同的配置,并与不同版本的 MinGW-w64 头文件/库捆绑在一起。

MSYS2 只提供 posix 线程模型(pthreads); dwarf 用于 i686,seh 用于 x86_64。 MinGW提供posix和win32线程模型; sjlj 和 dwarf 用于 i686,seh 和 sjlj 用于 x86_64。

因此,MSYS 应用程序需要使用pthreads 库构建。您可以强制 x264 的 MSYS 构建使用 posix 线程模型,而不是像这样的 win32 模型:

$ ./configure --disable-cli --enable-shared --disable-win32thread

平台:X86_64 字节顺序:小端序 系统:WINDOWS cli:是的 libx264:内部 共享:是的 静态:无 asm:是的 隔行扫描:是 avs: avisynth lavf: 没有 实况调查团:没有 mp4:没有 gpl:是的 线程:posix opencl:没有 过滤器:裁剪 select_ever lto: 没有 调试:没有 gprof:没有 脱衣舞:没有 图片:是的 位深:全部 色度格式:全部

您现在可以运行“make”或“make fprofiled”。

问题是,没有msys/winpthreads 包,所以你首先需要为MSYS2 交叉编译pthreads-win32


说了这么多,你说

用于编译共享 dll

而不是

用于编译 .so 共享库

所以这对我来说似乎是一个 x-Y 问题。我认为您应该像这样使用 MSYS 来交叉编译 x264:

$ ./configure --host=x86_64-w64-mingw32 --disable-cli --enable-shared --cross-prefix=x86_64-w64-mingw32-

(我也会使用--prefix=/usr/local--disable-opencl 来与FFmpeg 兼容。

【讨论】:

【参考方案2】:
./configure --enable-shared --enable-static --disable-thread

我遇到了同样的问题。它适用于禁用的线程。

【讨论】:

治标不治本;现在 x264 将被限制为单个线程!【参考方案3】:

我使用了以下选项:

./configure --disable-cli --enable-shared 

但不想禁用线程,所以,我所做的修改win32thread.c如下:

之前:

  #if HAVE_WINRT
  /* _beginthreadex() is technically the correct option, but it's only available for Desktop applications.
   * Using CreateThread() as an alternative works on Windows Store and Windows Phone 8.1+ as long as we're
   * using a dynamically linked MSVCRT which happens to be a requirement for WinRT applications anyway */
  #define _beginthreadex CreateThread
  #define InitializeCriticalSectionAndSpinCount(a, b) InitializeCriticalSectionEx(a, b, CRITICAL_SECTION_NO_DEBUG_INFO)
  #define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
  #else
  #include <process.h>
  #endif

之后

  #define _beginthreadex CreateThread

  #if HAVE_WINRT
  #define InitializeCriticalSectionAndSpinCount(a, b) InitializeCriticalSectionEx(a, b, CRITICAL_SECTION_NO_DEBUG_INFO)
  #define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
  #endif

基本上,我将_beginthreadex 替换为Windows 原生的CreateThread。不确定这对 x264 来说是个大问题,但现在我可以编译了。

【讨论】:

以上是关于x264项目编译的主要内容,如果未能解决你的问题,请参考以下文章

mac下使用NDK21 Clang编译x264

centos编译ffmpeg x264

x264 x265交叉编译 ffmpeg交叉编译安装

在linux中编译x264时出错

linux下x264库ARM交叉编译

x264编译选项