编译libfdk-aac

经验的误区

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo4776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值