用VC编译libMPG123库
首先从http://mpg123.org/ 下载最新的源码包,解压后得到如下目录结构
将src/libmpg123目录下的全部文件拷贝到ports/MSVC++/libMPG123目录下。
打开VS装入libMPG123.vcproj工程文件,按 “生成” 按钮,编译提示 mpg123.h, config.h 文件找不到。查找原始的src文件目录下确实没有这两个文件,但是有mpg123.h.in, config.h.in 两个文件,用记事本打开查看就是c的代码文件,于是将他们拷贝过来后然后去掉后面的 .in 扩展名,编辑 mpg123.h 将前面的
@INCLUDE_STDLIB_H@
@INCLUDE_SYS_TYPE_H@
两行替换为
#include <stdlib.h>
#include <sys/types.h>
再进行编译,提示
libmpg123\mpg123.h(732) : error C2081: “ssize_t”: 形参表中的名称非法
网上搜了一把原来是 VC 中没有ssize_t这个类型定义,于是按照config.h最后面的提示在mpg123.h 中添加如下一个类型定义
#ifdef _MSC_VER
typedef long ssize_t;
#endif
再次编译,还是提示出错,主要是在 mpg123lib_intern.h中提示有一些引入的 .h 文件找不到,找到相对应的错误行可以看到是由一个 #ifdef 定义的开关来做引入库定义的,通过查找发现这些名称是在 config.h 中定义的,记下名称,到config.h 中将对应该名称的 #define 语句注释掉。
再次重新编译,还是失败,分析发现是由于一个ALIGNED(16) 的宏造成的。通过在工程中查找ALIGNED,发现
他是在 config.h 文件中通过
#define CCALIGN 1
来控制使用ALIGNED的,可以将其注释掉,或者在optimize.h中将ALIGNED(a)的宏定义由
#ifdef CCALIGN
#define ALIGNED(a) __attribute__((aligned(a)))
#else
#define ALIGNED(a)
#endif
修改为
#ifdef CCALIGN
#ifdef _MSC_VER
#define ALIGNED(a) __declspec(align(a))
#else
#define ALIGNED(a) __attribute__((aligned(a)))
#endif
#else
#define ALIGNED(a)
#endif
再重新编译,没有新的error 出来,编译通过。
编译工作到此结束,以后就可以通过VC来试验用libMPG123来进行mp3解码了。
附:网上一篇文章,gcc和VC编译器的一些差异
http://www.mathmagic.cn/bbs/read.php?tid=7145
Popularity: 3% [?]
Related
Comments
5 Responses to “用VC编译libMPG123库”
不知道为什么,我编译出来的有问题……
[Reply]
用原来的版本VCPROJ,DEBUG下面就是说找不到几个函数(比如optimise.c西面的check_decoder,说找不到)貌似也不在宏定义下面,结果自己另外开了一个新的工程,按照原来的PROJ定义了宏其他不变,运行了之后声音是错误的……(噪声,但是隐约有声音,可以努力识别的……)
不知道问题在哪里……
[Reply]
没有碰到你的问题,不过我为htk添加mp3格式输入源扩展时,当mp3文件大一些且解码完成后就会有内存非法操作出错,不知道是htk问题还是libMPEG问题,
[Reply]
你好,我按照您的方法 编译最新的mpg123(mpg123-1.10.0)
失败。 您详解一下VS2005下使用此解码的步骤码。最近想做一个mp3播放器。我如何能得到它的dll
[Reply]
哦 对了,我只想要音频解码,或者说只要MP3解码,我该怎么做?它自带的ports\MSVC++\CMP3Stream是这个吗,我还是编译不过啊
[Reply]