静态编译的方式合并第三方dll,并生成自己的dll,以及出现‘__acrt_first_block == header’异常解决方式

版权声明:本文为业余狙击手原创文章,欢迎阅读,欢迎转载,转载请注明出处,谢谢。 https://blog.csdn.net/sxlsxl119/article/details/82856419

有时候调用了第三方的dll,但是由于种种原因不希望让人看出来,需要将第三方dll封装到自己的dll里,在使用时,让别人只用你的dll,而不用调用你使用的第三方dll。
怎么实现?
用静态编译的方式!

最近由于项目需要,用VS2015+opencv2.4.13编程实现了静态编译生成自己的dll,这个dll相当于将opencv的部分功能封装到自己的dll中了(不要跟我说opencv开源,不需要封装到自己的dl之类的话,opencv是不需要,肯定有其他dll需要,这里只是用opencv举个例子哈)。

第一步,用静态编译方式生成dll
静态编译生成dll按照以下链接中的文章操作就行
https://blog.csdn.net/wjbwjbwjbwjb/article/details/44899667

第二步,使用生成的dll,遇到问题
按上面文章很容易实现对第三方dll的封装,这篇文章我主要想记录的是我在调用生成的dll中遇到的一些问题

调用自己的dll的具体配置方式和配置opencv方式一样(方法一样,但是只配置自己dll的路径就行,不用配置opencv的)
就是如下面所说的,会出现内存错误,使用时各项功能都正常,但是最后程序结束时就会出现‘__acrt_first_block == header’异常,这个异常的原因如下:(为了节约时间,尽量引用他人的话吧)
在这里插入图片描述

文中说,要么改为动态链接。但是有时必须用静态链接咋办?
看下面:
或者采用静态链接的方式,不要在主程序和dll之间传递vector,或者先给vector预留足够的空间作为静态存储使用。

第三步,解决问题
一开始,我使用的是在调用dll的程序中申请变量,然后用该变量接收dll函数的返回值,这样在程序退出时就会出现‘__acrt_first_block == header’异常 (注意下图获取边框信息那行,出现错误提醒是因为此时函数结构已经变了,为了重现语句错误写法而特意改的)
在这里插入图片描述
期间也参考了一些文章
https://blog.csdn.net/10km/article/details/80522287
我最后用的方式是,在调用dll的程序中申请一个变量,然后用引用传入的方式进入dll,最后就不会出现上面的内存问题了。
在这里插入图片描述

这个bug困扰了我大概1天的时间,记录一下,同时希望对你有帮助。

猜你喜欢

转载自blog.csdn.net/sxlsxl119/article/details/82856419
今日推荐