x264项目编译
Compilation of x264 project
我已经下载了x264库的源代码。
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 Pro
- 带mingw64的MSYS64
- Microsoft Visual Studio 2015
configure命令执行时没有出现错误,但make给了我上述错误。
GCC由MSYS2/MinGW构建,具有不同的配置,并与不同版本的MinGW-w64头/libs捆绑在一起。
- MSYS2仅提供posix线程模型(pthreads);i686为侏儒,x86_64为seh
- MinGW提供posix和win32线程模型;i686的sjlj和dwarf,x86_64的seh和sjj
Ergo,MSYS应用程序需要使用pthreads
库构建。您可以强制x264的MSYS构建使用posix线程模型,而不是像这样的win32模型:
$ ./configure --disable-cli --enable-shared --disable-win32thread
平台:X86_64
字节顺序:little-endian
系统:WINDOWS
cli:yes
libx264:内部
共享:yes
静态:否
asm:yes
隔行扫描:yes
avs:avisynth
lavf:no
ffms:no
mp4:no
gpl:yes
线程:posix
opencl:no
筛选器:crop select_every
lto:no
调试:no
gprof:noPIC:yes
位深度:all
色度格式:all您现在可以运行"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-
(为了与FFmpeg兼容,我也会使用--prefix=/usr/local
和--disable-opencl
./configure --enable-shared --enable-static --disable-thread
我也有同样的问题。它适用于禁用的线程。
我使用了以下选项:
./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
基本上,我用Windows的原生CreateThread
替换了_beginthreadex
。不确定这对x264来说是个大问题,但现在我可以编译了。
- 当我尝试通过 mingw 使用 CMake 和 SFML 库编译项目时出错
- LD:尝试编译项目时找不到架构x86_64符号
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 如何使用 Makefile 使用 VTK 库编译项目?
- UE4无法使用vs2017编译C++项目
- 无法让 CMAKE 编译项目
- 了解如何编译C++项目
- [UE4错误]无法编译项目.你想在Visual Studio中打开它吗?
- 使用 -O1 优化标志编译项目时共享库崩溃
- 每次都构建(make)lib,只有在lib较新时才重新编译项目
- 如何在 g++ 上使用 opencv 编译项目 c++
- 尝试使用 TMXlite 编译项目时LNK2019错误
- 编译项目时文件无效或损坏,包括 V8
- 为什么当我在Visual Studio中编译C++项目时会出现致命错误"LNK1104:无法打开文件'cryptlib.lib'?
- 在 netbeans 中编译项目中的单个文件
- 用cmake中的makefile编译项目
- 使用makefile编译C++项目时出现问题
- 用多个文件制作和编译C 项目
- 如何有条件地为 Eclipse 中的交叉编译项目包含两个不同名称的相同版本的库
- 如何编译项目后不运行exe文件