如何解决VS2005中出现的'__restrict'错误

时间:2022-05-21 19:34:25
  大家好,我在使用Visual studio 2005的时候,在编译FFMPEG和一些其他的开源工程的时候,遇见这样奇怪的错误,我简直无法解决,请各位高人给看看:
Error3 error C2485: '__restrict' : unrecognized extended attribute f:\program files\microsoft visual studio 8\vc\include\stdlib.h 638
  这样的提示语句会出现好多次,最终导致程序编译失败,但是我却不能发现这样的原因倒是是很么,上面的出错信息时我在编译drffmpeg时候出现的,该开源工程可以从下面的连接中得到:drFFMPEGhttp://sourceforge.net/project/showfiles.php?group_id=145411&package_id=159960最下面有一个drdivx展开后,下载drdivx2.tar.bz2  和drffmpeg.tar.bz2  ,不用修改可以直接在vs2005下编译32位系统.

7 个解决方案

#1


你不应该使用VC编译器编译FFMPEG,而应该使用MinGW来编译。
语法不支持,当然会报错了。

#2


  由于FFMpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译。要想使用FFMpeg,最先要解决的问题就是在Windows下配置一个类似Linux的编译环境,将FFMpeg编译为二进制库以后,再利用其进行进一步开发。
  MSVC++并不严格的遵循C标准,所以整个编译过程必须使用MSys+MinGW系统来完成。如果选择编译动态链接库(dll),这些库将和其他的动态链接库一样在使用上没什么差别,可以使用MSVC++来链接这些库到自己的程序,只有这种情况下MSVC++是被支持的。
  FFmpeg在Windows系统下的编译过程如下:

准备MSys+MinGW系统 
  1)安装MSys
  到http://sourceforge.net/project/showfiles.php?group_id=2435下载文件:
  bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
  msysCORE-1.0.11-2007.01.19-1.tar.bz2
  (可能会有版本变化,以下同)
  解压msysCORE-1.0.11-2007.01.19-1.tar.bz2,比如解压到D:\msys(以下内容都使用该路径描述)。
  解压bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,产生一个名为bash-3.1的目录,在该目录下有一个子目录名为bin,其他的目录不需要关心。复制bin目录中的所有文件到D:\msys\bin,提示是否要覆盖sh.exe的时候,选择是。
  到“D:\msys\postinstall”目录下执行pi.bat,在出现的提示中输入n回车后,按任意键退出即可。
  2)安装MinGW
  同样是到http://sourceforge.net/project/showfiles.php?group_id=2435下载文件:
  binutils-2.17.50-20060824-1.tar.gz
  gcc-core-3.4.5-20060117-1.tar.gz
  gcc-g++-3.4.5-20060117-1.tar.gz
  w32api-3.9.tar.gz
  mingw-runtime-3.12.tar.gz
  把它们全部解压到D:\msys\mingw。
  3)修改“msys.bat”
  用文本编辑器打开D:\msys\msys.bat,由于打算用MSVC++编译程序,所以需要有.lib文件才能链接到FFmpeg的库,这些.lib文件可以使用微软的工具链中lib命令产生。为此,机器上必须已经安装了微软的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路径替换成机器上vcvars32.bat实际存在的路径,比如我的在"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat",于是就添加:
  call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
  4)系统整合
  复制D:\msys\etc\fstab.sample为D:\msys\etc\fstab,用文本编辑器打开D:\msys\etc\fstab编辑。(需要使用一个支持Unix换行风格的编辑器,比如Notepad++),把下面这行:
  d:/mingw /mingw
  改为:
  d:/msys/mingw /mingw
  完成以上步骤,MSys+MinGW系统就配置完成了。
 这是一个类似Linux的shell并且在Windows上运行,就像是在使用一个真正的Linux shell。不过使用这个shell时需要注意:
  →目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(比如说要写成"D:/ffmpeg"而不是"D:\ffmpeg")。
  →盘符(例如"C:\")可以从根目录处访问(像这样"/C/")。
  →文件名或目录名中如果带有空格,必须用双引号括起(例如这样"/C/Program Files",带有双引号)。
  下面切换到存放FFmpeg源代码的目录,方法是输入:"cd /D/ffmpeg"。
  接下来要配置FFmpeg,选择编译时包含的库,对于如何加入对第三方库的支持,请看后续描述,这里先输入:
  ./configure --enable-memalign-hack
  --enable-memalign-hack选项是FFmpeg在Windows上编译成功所必须指定的,待配置完成后,将回到命令提示符

这时程序已经编译好了,在存放FFmpeg源代码的目录下可以找到ffmpeg.exe这个文件。
  之后,如果希望把FFmpeg安装到系统中,可以执行安装步骤:"make install",这将会复制所有生成的重要文件到MSys的local文件夹下。
  由于我只是调用FFmpeg,所以没有安装,而是把ffmpeg.exe复制到需要的目录下,作为一个模块使用。
  如果希望使用FFmpeg包含的libavcodec库开发多媒体文件处理程序,还需要编译libavcodec的dll动态链接库,编译过程和上述过程稍有差别,如下所述:
  首先切换到FFmpeg的源代码目录,在开始编译前先使用"make distclean"清理上一次留下的中间文件,然后向configure脚本多传递两个参数:
  ./configure --enable-shared --disable-static --enable-memalign-hack
  最后执行"make"命令就可以了。
  这种编译方式能够得到供MSVC++使用的文件,从而使用MSVC++进行进一步开发。

链接 
  在FFmpeg目录下有三个子目录名字分别为:libavutil、libavcodec和libavformat,如果在前述步骤中成功生成了动态链接库,那么在这三个目录下都有一个SLIBNAME_WITH_MAJOR.lib这样的文件,例如我生成的是avcodec-51.lib、avformat-51.lib 和 avutil-49.lib,MSVC++可以从这些文件中知道dll的导出函数。
  现在通过包含FFmpeg的头文件,和使用上述三个lib文件进行链接,就能够编写具备FFmpeg功能的应用程序了。

加入对第三方库的支持 
  我以加入对mp3lame的支持为例,说明加入第三方库的方法。
  首先需要下载mp3lame,这里有两个方案可以选择:
  →到http://sourceforge.net/project/showfiles.php?group_id=290下载lame-3.97.tar.gz,使用以下命令编译并安装到MinGW的库中:
  ./configure --prefix=/static --disable-shared --enable-static
  make
  make install
  或者将mp3lame编译为动态链接库:
  ./configure --prefix=/shared
  make
  make install
  →到http://oss.netfarm.it/mplayer-win32.php下载已经编译的mp3lame库,解压后复制到“D:\msys\mingw”文件夹下。
  接下来和前述步骤类似,切换到存放FFmpeg源代码的目录,在传递配置参数时要加入“--enable-libmp3lame” ,即使用以下命令配置:
  ./configure --enable-static --enable-shared --enable-memalign-hack --enable-libmp3lame

===========================================================

错误:

Unknown option “–enable-mingw32″.
See ./configure –help for available options.

and when I remove –enable-mingw32 I get:

gcc is unable to create an executable file.
If gcc is a cross-compiler, use the –cross-compile option.
Only do this if you know what cross compiling means.
C compiler test failed.
If you think configure made a mistake, make sure you are using the latest
version from SVN. If the latest version fails, report the problem to the
ffmpeg-devel@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file “config.err” produced by configure as this will help
solving the problem.

解决方案:config.err中出现d:temp/conf, 将环境变量TEMPDIR的值“D:\Temp”改成“D:/Temp”

错误2:

configure: line 195: pr: command not found 

解决方案:下载coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2覆盖D:\MSYS\bin即可

另外,一定要保持最新版本,本文前面直接从其他文章copy过来,没有修改相关数据。编译过程中出现很多错误,没有一一记录。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sky04/archive/2009/03/20/4008764.aspx

#3


编译不支持你的代码,你看FFMpeg官方是否有VS相关的工程等.下载对应的代码

#4


我在用VC编译某开源库时也遇到这个问题
参考这个帖子
http://www.codeproject.com/Messages/2651289/Re-i-got-a-compiling-error-like-error-C2485-__rest.aspx

搜索"#define restrict __restrict",然后将之注释即可,似乎VC本身已经有restrict,而不含__restrict

#5


学习

#6


该回复于2011-05-11 10:29:50被版主删除

#7


该回复于2012-06-26 10:58:19被版主删除

#1


你不应该使用VC编译器编译FFMPEG,而应该使用MinGW来编译。
语法不支持,当然会报错了。

#2


  由于FFMpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译。要想使用FFMpeg,最先要解决的问题就是在Windows下配置一个类似Linux的编译环境,将FFMpeg编译为二进制库以后,再利用其进行进一步开发。
  MSVC++并不严格的遵循C标准,所以整个编译过程必须使用MSys+MinGW系统来完成。如果选择编译动态链接库(dll),这些库将和其他的动态链接库一样在使用上没什么差别,可以使用MSVC++来链接这些库到自己的程序,只有这种情况下MSVC++是被支持的。
  FFmpeg在Windows系统下的编译过程如下:

准备MSys+MinGW系统 
  1)安装MSys
  到http://sourceforge.net/project/showfiles.php?group_id=2435下载文件:
  bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
  msysCORE-1.0.11-2007.01.19-1.tar.bz2
  (可能会有版本变化,以下同)
  解压msysCORE-1.0.11-2007.01.19-1.tar.bz2,比如解压到D:\msys(以下内容都使用该路径描述)。
  解压bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,产生一个名为bash-3.1的目录,在该目录下有一个子目录名为bin,其他的目录不需要关心。复制bin目录中的所有文件到D:\msys\bin,提示是否要覆盖sh.exe的时候,选择是。
  到“D:\msys\postinstall”目录下执行pi.bat,在出现的提示中输入n回车后,按任意键退出即可。
  2)安装MinGW
  同样是到http://sourceforge.net/project/showfiles.php?group_id=2435下载文件:
  binutils-2.17.50-20060824-1.tar.gz
  gcc-core-3.4.5-20060117-1.tar.gz
  gcc-g++-3.4.5-20060117-1.tar.gz
  w32api-3.9.tar.gz
  mingw-runtime-3.12.tar.gz
  把它们全部解压到D:\msys\mingw。
  3)修改“msys.bat”
  用文本编辑器打开D:\msys\msys.bat,由于打算用MSVC++编译程序,所以需要有.lib文件才能链接到FFmpeg的库,这些.lib文件可以使用微软的工具链中lib命令产生。为此,机器上必须已经安装了微软的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路径替换成机器上vcvars32.bat实际存在的路径,比如我的在"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat",于是就添加:
  call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
  4)系统整合
  复制D:\msys\etc\fstab.sample为D:\msys\etc\fstab,用文本编辑器打开D:\msys\etc\fstab编辑。(需要使用一个支持Unix换行风格的编辑器,比如Notepad++),把下面这行:
  d:/mingw /mingw
  改为:
  d:/msys/mingw /mingw
  完成以上步骤,MSys+MinGW系统就配置完成了。
 这是一个类似Linux的shell并且在Windows上运行,就像是在使用一个真正的Linux shell。不过使用这个shell时需要注意:
  →目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(比如说要写成"D:/ffmpeg"而不是"D:\ffmpeg")。
  →盘符(例如"C:\")可以从根目录处访问(像这样"/C/")。
  →文件名或目录名中如果带有空格,必须用双引号括起(例如这样"/C/Program Files",带有双引号)。
  下面切换到存放FFmpeg源代码的目录,方法是输入:"cd /D/ffmpeg"。
  接下来要配置FFmpeg,选择编译时包含的库,对于如何加入对第三方库的支持,请看后续描述,这里先输入:
  ./configure --enable-memalign-hack
  --enable-memalign-hack选项是FFmpeg在Windows上编译成功所必须指定的,待配置完成后,将回到命令提示符

这时程序已经编译好了,在存放FFmpeg源代码的目录下可以找到ffmpeg.exe这个文件。
  之后,如果希望把FFmpeg安装到系统中,可以执行安装步骤:"make install",这将会复制所有生成的重要文件到MSys的local文件夹下。
  由于我只是调用FFmpeg,所以没有安装,而是把ffmpeg.exe复制到需要的目录下,作为一个模块使用。
  如果希望使用FFmpeg包含的libavcodec库开发多媒体文件处理程序,还需要编译libavcodec的dll动态链接库,编译过程和上述过程稍有差别,如下所述:
  首先切换到FFmpeg的源代码目录,在开始编译前先使用"make distclean"清理上一次留下的中间文件,然后向configure脚本多传递两个参数:
  ./configure --enable-shared --disable-static --enable-memalign-hack
  最后执行"make"命令就可以了。
  这种编译方式能够得到供MSVC++使用的文件,从而使用MSVC++进行进一步开发。

链接 
  在FFmpeg目录下有三个子目录名字分别为:libavutil、libavcodec和libavformat,如果在前述步骤中成功生成了动态链接库,那么在这三个目录下都有一个SLIBNAME_WITH_MAJOR.lib这样的文件,例如我生成的是avcodec-51.lib、avformat-51.lib 和 avutil-49.lib,MSVC++可以从这些文件中知道dll的导出函数。
  现在通过包含FFmpeg的头文件,和使用上述三个lib文件进行链接,就能够编写具备FFmpeg功能的应用程序了。

加入对第三方库的支持 
  我以加入对mp3lame的支持为例,说明加入第三方库的方法。
  首先需要下载mp3lame,这里有两个方案可以选择:
  →到http://sourceforge.net/project/showfiles.php?group_id=290下载lame-3.97.tar.gz,使用以下命令编译并安装到MinGW的库中:
  ./configure --prefix=/static --disable-shared --enable-static
  make
  make install
  或者将mp3lame编译为动态链接库:
  ./configure --prefix=/shared
  make
  make install
  →到http://oss.netfarm.it/mplayer-win32.php下载已经编译的mp3lame库,解压后复制到“D:\msys\mingw”文件夹下。
  接下来和前述步骤类似,切换到存放FFmpeg源代码的目录,在传递配置参数时要加入“--enable-libmp3lame” ,即使用以下命令配置:
  ./configure --enable-static --enable-shared --enable-memalign-hack --enable-libmp3lame

===========================================================

错误:

Unknown option “–enable-mingw32″.
See ./configure –help for available options.

and when I remove –enable-mingw32 I get:

gcc is unable to create an executable file.
If gcc is a cross-compiler, use the –cross-compile option.
Only do this if you know what cross compiling means.
C compiler test failed.
If you think configure made a mistake, make sure you are using the latest
version from SVN. If the latest version fails, report the problem to the
ffmpeg-devel@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file “config.err” produced by configure as this will help
solving the problem.

解决方案:config.err中出现d:temp/conf, 将环境变量TEMPDIR的值“D:\Temp”改成“D:/Temp”

错误2:

configure: line 195: pr: command not found 

解决方案:下载coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2覆盖D:\MSYS\bin即可

另外,一定要保持最新版本,本文前面直接从其他文章copy过来,没有修改相关数据。编译过程中出现很多错误,没有一一记录。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sky04/archive/2009/03/20/4008764.aspx

#3


编译不支持你的代码,你看FFMpeg官方是否有VS相关的工程等.下载对应的代码

#4


我在用VC编译某开源库时也遇到这个问题
参考这个帖子
http://www.codeproject.com/Messages/2651289/Re-i-got-a-compiling-error-like-error-C2485-__rest.aspx

搜索"#define restrict __restrict",然后将之注释即可,似乎VC本身已经有restrict,而不含__restrict

#5


学习

#6


该回复于2011-05-11 10:29:50被版主删除

#7


该回复于2012-06-26 10:58:19被版主删除