分类: 嵌入式
2013-12-18 20:31:17
限于笔者水平,文中谬误之处,敬请告知笔者,不胜感激。
若一个交付用户的产品由嵌入式端、通用微机组成,微机端软件通常使用微软平台开发(运行),而嵌入式端可能由GNU平台开发。在处理某些数据时最好使用相同的程序库,这就需要编译相应库(Unix-like C工程)的Windows版本。以编译libopencore-amrnb-0.dll为例,本文演示如何利用MinGW、MSYS、Visual Studio 2010搭配完成该任务。
假定读者对GNU编译工具链稍有了解。
1)MinGW(Minimalist GNU on Windows)
该项目提供了方便的安装工具,其下载地址为:
运行该安装程序,会从网络自动下载安装文件。
在第3步选择“Download latest repository catalogues”
选择安装路径:本文安装路径为“D:\MSYS”。
在“Select Components”步骤中选择:
√ C Compiler (默认且一定选择)
√ C++ Compiler
√ MSYS Basic System(选择此项将会安装msys,msys则不需要另外安装)
√ MinGW Developer ToolKit
安装完成后,已包含MSYS。
2)准备opencore-amr库源码
其下载地址为:
当前(2013.12.18)版本为opencore-amr-0.1.3,也是项目中基站使用的版本。
本文源码存放目录为:“D:\opencore-amr-0.1.3”。
3)安装Visual Studio 2010
过程略。本文的安装路径为“D:\Program Files (x86)\Microsoft Visual Studio 10.0”。
1)编辑“D:\MSYS\msys\1.0\msys.bat”,在文件的开头加入如下一行:
call "D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
2)运行“D:\MSYS\msys\1.0\msys.bat”,
cd /d
cd opencore-amr-0.1.3
./configure --prefix=D:/MSYS/msys/1.0/local
make
make install
D:\MSYS\msys\1.0\local存放编译后得到的文件。
得到DLL库文件:libopencore-amrnb-0.dll、libopencore-amrwb-0.dll。
3)在D:\MSYS\msys\1.0\local\bin目录中执行:
pexports.exe libopencore-amrnb-0.dll > libopencore-amrnb-0.def
4)将“D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\”目录下的lib.exe、 link.exe以及“D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\” 目录下的mspdb100.dll复制到“D:\MSYS\msys\1.0\local\bin”目录(目标库所 在目录)。
执行:
lib.exe /machine:i386
/def:libopencore-amrnb-0.def /out:libopencore-amrnb-0.lib
备注:
实践得知,第二步编译出的dll文件不能用于VC++编译器(故而有了第三、第四步)。编译得到的libopencore-amrnb.a可供MinGW编译器(Win7)调用。
VC++编译与MinGW GCC编译器使用的动态库格式有差异。恐怕有更准确的配置方法笔者尚不清楚。
第三步导出符号表,第四步生成lib库,在VC++工程中调用lib库,转由该库调用dll动态库。
使用Visual Studio 2010创建VC++工程,并对库路径进行配置(非本文要点,过程从略)。
编写测试代码,编译工程,将libopencore-amrnb-0.lib、libopencore-amrnb-0.dll复制至程序所在目录(或其他链接库搜索路径),执行如下图: