当前位置: 首页 > 工具软件 > yaf-lib > 使用案例 >

编译libfdk-aac

周龙光
2023-12-01

经验的误区

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的区别

 类似资料: