fdk-aac项目中并没有直接提供vs下的编译工程,也没有CmakeList 脚本。所以我凭经验判断,源码是需要在mingw环境下编译。正是这种直观,简单的判断,直接在编译上挖了个坑。
我用mingw很顺利编译出了libfdk-aac.a库,结果在链接到执行程序时出错了,错误如下:
(fft.o) : fatal error LNK1143: 无效或损坏的文件: 没有 COMDAT 0x7 节的符号
这个错误的意思是指msvc的链接器不认识fft.o这个目标文件。一般的,mingw产生的静态库是可以被msvc链接的,前提是提供的C接口,并且用了extern c修饰。fdk-aac的接口风格也是如此。应该不会出现这个问题。
所以我直接蒙圈了。
在网上找一圈,始终找不到解决方法。只能硬着头皮去看Makefile脚本,结果终于找到了解决方法。
fdk-aac其实提供了在windows下的一个编译脚本Makefile.vc,使用msvc nmake去编译即可。
在vs2015提供命令工具中直接进入fdk-aac的源码目录,使用如下命令进行编译
nmake -f Makefile.vc all
该脚本编译出静态库,动态库,产生动态库接口导出文件
fdk-aac.lib
fdk-aac-1.dll
fdk-aac.dll.lib
fdk-aac.def
使用动态库去链接执行程序,结果报函数找不到
找不到如下函数
aacEncOpen
aacEncClose
aacEncEncode
导出静态库的函数,发现对应的函数前都加了一个下划线
fdk-aac.lib中的函数
_aacEncOpen
_aacEncClose
_aacEncEncode
那为什么链接时找的函数跟库提供的函数不一致呢?
原来我编译的静态库是32位的,而执行程序是64位的,32位的静态库中C接口的name mangling是带了下划线的,而64位的静态没有下划线
用vs2015 x86 x64命令行再次编译即可
1.查看源代码是否带有windows下的编译脚本一定,不要忽略Makefile文件
2.要注意windows下32位,64位静态库的name mangling的区别