在VC2015中调试FFMPEG

编译X264需要至少 VS2013 update 2 以上版本. 本文使用 VS2015.

示例工程:https://github.com/gitgjogh/FFmpeg-gitgjogh/tree/msvc/build_msvc

Build Libav*** Using MSVC Compiler Under MINGW32

Import vcvar Into MSYS (MINGW32)

  • Scheme#1: From Start Menu->vs2015->tools->VS2015 x86 本机工具命令提示 start msys.bat binding with mingw32. (Don‘t use mingw64)
  • Scheme#2: Add call "C:/Program Files/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" to the 1st line of msys.bat. Then kick off msys.bat.

Confirm vcvar has been imported:

$ which link nmake
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/link.exe
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/nmake.exe

nmake is the make programe under MSVC. Needed for making zlib. See later.

Fix Collision Between VC-link And MSYS-LINK

  • VC-link links obj/libs files to create exe/dll file
  • MSYS-LINK creates a link named FILE2 to an existing FILE1.

It is possible that msys‘s file linker or coreutils‘s linker conflicts with MSVC’s linker. You can find out by runningwhich link to see which link binary you are using. If it is located at /bin/link.exe, mv /bin/link.exe to /bin/msys-link.exe

Yasm

X264

You need at least VS2013 update 2 to compile x264.

Go to an x264 source tree

> $ CC=cl ./configure --prefix=${PATH_TO_build_msvc} --enable-static --disable-gpl --enable-debug --enable-win32thread
> $ make && make install
> $ MSVC=‘/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/‘
> $ cp libx264.lib ${MSVC}/lib/x264.lib
> $ cp x264.h x264_config.h ${MSVC}/include/

Zlib

  • $ cd zlib-1.2.8
  • Edit win32/Makefile.msc so that CFLAGS uses -MT instead of -MD, since this is how FFmpeg is built as well.
    > del CFLAGS = -nologo -MD -W3 -O2 -Oy--Zi -Fd"zlib" $(LOC)
    > add CFLAGS = -nologo -MT -W3 -O2 -Oy -Zi -Fd"zlib" $(LOC)
  • Edit zconf.h and remove its inclusion of unistd.h. This gets erroneously included when building FFmpeg.
  • $ nmake -f win32/Makefile.msc
  • Move zlib.libzconf.h and zlib.h to somewhere MSVC can see.
    > $ MSVC=‘/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/‘
    > $ cp zlib.lib ${MSVC}/VC/lib/
    > $ cp zconf.h zlib.h ${MSVC}/include/

reference: http://www.ffmpeg.org/platform.html

Build FFmpeg Libs Using msvc Toolchain

under build_msvc:

> $ madir build && cd build
> $ ../../configure --prefix=`pwd`/.. --toolchain=msvc --disable-shared --enable-static --enable-libx264 --enable-gpl
> $ make --debug | tee make.log
> $ make install

If configuration failed because ‘can‘t find libx264‘:

> $ export PKG_CONFIG_PATH=${PATH_TO_build_msvc}/lib/pkg-config:$PKG_CONFIG_PATH

Create Win32 Console App. Project

Add the following files to the project:

cmdutils.h cmdutils_common_opt.h build/config.h ffmpeg.h
cmdutils.c ffmpeg.c ffmpeg_dxva2.cffmpeg_filter.c ffmpeg_opt.c

Clue: Run grep "^CC" make.log to see what files are compiled.

Add Dependency

  • Additional Include Directories: include;build
  • Additional Library Directories: lib
  • Additional Dependent Libraries:vfw32.lib;psapi.lib;strmiids.lib;shlwapi.lib;ws2_32.lib;x264.lib;zlib.lib;libavdevice.a;libavfilter.a;libswscale.a;libpostproc.a;libavformat.a;libavcodec.a;libswresample.a;libavutil.a

Clue#1: Under build_msvc, run env PKG_CONFIG_PATH=lib/pkgconfig/ pkg-config --libs libavdevice to see what additional libs need to be added. For example, my result is:

vfw32.lib user32.lib gdi32.lib psapi.lib ole32.lib strmiids.lib uuid.lib oleaut32.lib shlwapi.lib ws2_32.lib x264.lib zlib.lib advapi32.lib shell32.lib -L../lib -lavdevice -lavfilter -lswscale -lpostproc -lavformat -lavcodec -libpath:../lib -lswresample -lavutil

Clue#2: The following lines in the generated ‘Malefile‘ also can be took as reference to decide lib orders

# $(FFLIBS-yes) needs to be in linking order
FFLIBS-$(CONFIG_AVDEVICE)   += avdevice
FFLIBS-$(CONFIG_AVFILTER)   += avfilter
FFLIBS-$(CONFIG_AVFORMAT)   += avformat
FFLIBS-$(CONFIG_AVCODEC)    += avcodec
FFLIBS-$(CONFIG_AVRESAMPLE) += avresample
FFLIBS-$(CONFIG_POSTPROC)   += postproc
FFLIBS-$(CONFIG_SWRESAMPLE) += swresample
FFLIBS-$(CONFIG_SWSCALE)    += swscale

Set Preprocessor

-D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_WIN32_WINNT=0x0502 -nologo -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS

Clue#1: search ‘CPPFLAGS‘,‘CFLAGS‘,‘CXXFLAGS‘.‘ASFLAGS‘ in ‘config.mak‘ to see how autoconfig deal with ‘inline‘,‘snprintf‘ compatibility by setting ‘--toolchain=msvc‘ option.

Clue#2: search ‘^cl‘ in ‘config.log‘, see that how MSVC compiler ‘cl.exe‘ is called. Here is an example:

"cl -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_WIN32_WINNT=0x0502 -nologo -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -I../include -Z7 -W4 -wd4244 -wd4127 -wd4018 -wd4389 -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 -wd4152 -wd4324 -we4013 -wd4100 -wd4214 -wd4307 -wd4273 -wd4554 -wd4701 -O2 -Oy- -P -Fi./ffconf.wAKKajHY.o ./ffconf.FbkkcFDo.c"

Problems

Fix Collision Between LIBCMT.lib and msvcrtd.lib

1>------ 已启动生成:  项目: build_msvc, 配置: Debug Win32 ------
1>LIBCMT.lib(open.obj) : error LNK2005: __sopen 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMT.lib(_file.obj) : error LNK2005: ___iob_func 已经在 MSVCRT.lib(MSVCR120.dll) 中定义

reason: some code link to the static RTL(run time library), while some code link to dynamic RTL solution: set msvcr to /MT in "properties->C/C++->Code generation"

reference: https://msdn.microsoft.com/en-us/library/2kzt1wy3%28v=VS.71%29.aspx

Undefined Reference To ‘avresample_version‘, ‘postproc_version‘

two scheme:

1) goto "cmdutil.c"::"print_all_libs_info()", comment the following two lines:
    // PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
    // PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
2) configure --enable-avresample

Network Module

which has to link to the WINDOWS SDK, so be careful with how ‘_WIN32_WINNT‘ defined in ‘config.mak‘ or ‘config.log‘, copied it to the VC preprocessors. Reference to the "set preprocessor" section.

时间: 2024-10-19 09:56:34

在VC2015中调试FFMPEG的相关文章

使用 VS2015 编译并调试 ffmpeg

导读 ffmpeg 是音频处理方面非常强大非常有名的开源项目了,然而如 雷神 所说,“FFMPEG 难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接触 FFMPEG 的人学习:而且很多的例子程序编译通不过,极大地打消了学习的积极性”,对于平时只习惯在 Windows 下开发的开发的初学者来说,从零开始了解相关依赖,搭建起项目并调试 ffmpeg 并不是件容易的事,好在另一个非官方的 开源项目,提供了一整套 Windows 下,用 V

Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法

想起自己的windbg配置就转载:eqera的windows内核调试配置,真的是获益良多希望他不会介意我转载他的博客,帮了我很多,记录下来给我也给大家, 其中我主要看的是VMWare的pipe建立,而我有些分享是在vs2015中打上DDK,然后在开始菜单window kits下找见windbgx86或者是你想要用的类型,然后 发送快捷方式到桌面利于以后用.发到桌面后,在属性插入你放置的的符号的路径,让然最后别忘了在windbg检查路径是否正确. eqera他的解述给了我很多帮助,可以耐心解读.下

在eclipse中调试web项目的时候如何把web项目分配给配置好的服务器

举个例子,我今天在做spring和struts2整合的例子 新建项目blk 1.配置好web.xml,struts.xml,applicationContext.xml,写好jsp页面 2.把struts2.spring整合需要的jar包(struts核心jar包,spring核心jar包以及struts-spring-plugin.jar.commons-logging.jar)放到你项目的WEB-INF/lib目录下 3.写好java代码,并把java代码编译后的class文件拷贝到WEB-

在 Chrome 中调试 Android 浏览器

最近需要使用 Chrome Developer Tools 调试 Android 浏览器,但是官方指南并不是很好使,经过一番折腾,终于调试成功了,在此把经验分享给需要的朋友. Chrome Developer Tools 是前端工程师必不可少的工具,它极大的提高了我们的开发调试效率.在移动开发的时代,我们也必须掌握手机浏览器在 Chrome 中调试的方法.本篇仅介绍 Android. 环境 不同的环境可能存在一些差异,我的环境是: Windows 10 电脑 Chrome 50.0.2661.7

VS2015--在 Visual Studio 中调试时映射调用堆栈上的方法

https://msdn.microsoft.com/zh-cn/library/dn194476.aspx 在 Visual Studio 中调试时映射调用堆栈上的方法 创建代码图,以便在调试时对调用堆栈进行可视化跟踪.你可以在图中进行标注以跟踪代码执行的操作,以便专注于查找 Bug. 生成调用堆栈图 1 开始调试.(键盘:"F5") 2 在你的应用进入中断模式或你单步执行某一函数之后,请选择"代码图".(键盘:Ctrl + Shift + `) 当前的调用堆栈在

在Delphi7中调试COM

开发COM 应用系统最令人头痛的问题便是如何调试COM 组件了.由于COM 是执行在COM 的执行环境中,因此Delphi的程序员无法像Delphi的分布式多层应用系统一样可以直接在Delphi的IDE中设定应用程序服务器的断点来调试. 事实上,Delphi仍然可以在Delphi的集成开发环境中调试COM 组件,也可以让程序员在集成开发环境中在COM 组件的程序单元中设定断点,然后执行客户端应用程序调用COM 组件.此时Delphi便会把执行控制权带到Delphi的集成开发环境中,并且暂停在程序

visual stuidio2010 在iis中调试。

1 你的电脑装好IIS. 这是必须的. 2.更改.NET Framework 版本为你的项目所用的版本. 应用程序池对应的.NET Framework 版本也都要对应. 3将你电脑的默认网站目录定位到你的项目的web项目目录,访问你的本地网站是否正在显示.http://localhost 如果不能正常显示.第一 检查一下ASP.NET 是否安装.安装完了还要注意 注册ASP.NET  .注册ASP.NET 要切换到administrator用户下. 如果没有注册ASP.NET,打开网站会提示  

IIS7.5中调试.Net 4.0网站出现无厘头500错误的解决办法 (转)

刚刚 部署了ii7的dll的有x86写的,就会出现以下这样的问题 iis 7 x86,Could not load file or assembly 'Name' or one of its dependencies. An attempt was made to load a program with an incorrect format. 解决这样的,只要设置一下iis兼容x86程序就可以了,具体步骤: 1.开始-> 运行 2. 3. 高级设置, Enable 32 - Bit Appli

keil程序在外部RAM中调试的问题总结(个人的一点经验总结)

keil程序在内部RAM调试的基本步骤网上已经有很多了,我就不再赘述,大家可以在网上搜到很多. 但是有些时候内部RAM并不够用,这就需要将程序装入外部RAM中调试,而在这个过程中可能会出现各种各样的问题,在这里我将会把我遇到过的一些问题和需要注意的地方总结一下,希望能够对大家有所帮助. 有错误的地方也希望大神们能够不吝赐教,提前表示感谢··· 转载请注明出处:waitig's blog 先介绍下我项目使用的硬件,芯片是LPC1788,外部RAM是MT48LC4M32B2,大小为16M(128Mb