默认情况下,用MinGW/gcc 编译x264的动态库的时候只能生成libx264.dll和libx264.dll.a,这个.a文件不是标准的Win32的DLL导出函数所用到的lib格式,虽然可以修改文件名为libx264.lib,然后在VS2008中用:
#pragma comment(lib, "libx264.lib")
的方式来使用,但是由于此做法属于Hack性质的,不推荐,有可能遇到一些很诡异的错误。
比如我这边就会遇到很变态的错误:上面代码在DEBUG下可以使用,在RELEASE下就无法使用。
解决方法之一:
用 LoadLibrary() + GetProcAddress()来显式的调用x264相应的APIs
这种方式就是稍微麻烦了一点,好处是效率更高,因为比用lib的方式的隐式调用,少了一次函数跳转的开销。
解决方法之二
对最新的x264代码加入如下补丁:
----------------------------------------------------
diff --git a/Makefile b/Makefile
index ea6edd4..97e139d 100644
--- a/Makefile
+++ b/Makefile
@@ -109,6 +109,7 @@ libx264.a: .depend $(OBJS) $(OBJASM)
$(SONAME): .depend $(OBJS) $(OBJASM)
$(CC) -shared -o $@ $(OBJS) $(OBJASM) $(SOFLAGS) $(LDFLAGS)
+ lib /machine:i386 /def:libx264.def
x264$(EXE): $(OBJCLI) libx264.a
$(CC) -o $@ $+ $(LDFLAGS)
diff --git a/configure b/configure
index 0cc246d..13c5af1 100755
--- a/configure
+++ b/configure
@@ -500,9 +500,9 @@ EOF
if [ "$shared" = "yes" ]; then
API=$(grep '#define X264_BUILD' < x264.h | cut -f 3 -d ' ')
if [ "$SYS" = "MINGW" ]; then
- echo "SONAME=libx264-$API.dll" >> config.mak
+ echo "SONAME=libx264.dll" >> config.mak
echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
- echo 'SOFLAGS=-Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
+ echo 'SOFLAGS=-Wl,--output-def,libx264.def,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
elif [ "$SYS" = "MACOSX" ]; then
echo "SOSUFFIX=dylib" >> config.mak
echo "SONAME=libx264.$API.dylib" >> config.mak
延伸阅读:MSVC and MinGW DLLs http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs
(psusong) |