踩坑纪实(1):在Qt下开发了一段小算法,如何制作DLL动态链接库?

楼主一直在Qt环境下开发一个GUI软件,众所周知,是在Qt Creator(Qt官方IDE)下写C++的代码。这两天涉及到一个后台数据处理的算法,需要把它制作成DLL动态链接库提供给他人使用。其实这是一件so easy的事情,但第一次做,踩了几个坑,把这个过程记录下来。


首先进行方法上的列举和选择,基本上有这么几种:

  1. 在Qt Creator下依赖QtCore模块,个人理解是很多原生C++中的容器都在Qt中重新进行了包装,所以需要依赖这个模块。
  2. 在Qt Creator下不依赖任何模块,进行纯C++代码DLL库的制作。
  3. 在VS下制作DLL。

选择方法时考虑的因素:

  1. 既然是作为第三方库供其他人使用,当然要具有通用性,因此感觉上自然不想依赖任何Qt中的东西。因此要制作原生C++代码的DLL。
  2. 认为在VS下进行C++代码的开发和DLL库的制作,显然是当前更主流的方式。因此选择了第3个方法。

备注:

  1. 这3个方法全部都能在网上搜到图文介绍,我这里只记录一下自己踩过的坑。
  2. 其实无论是否依赖QtCore这类模块,最终生成的DLL库肯定都是二进制可执行代码。不过是开发人员写的代码不同,中间的编译阶段肯定也都帮我们做好了处理,保证二进制代码是OK的。

确定好方向之后,那就开始干吧~


我把使用DLL库的过程分为了三个阶段:

  1. 首先你的应用程序要加载这个第三方库,library load
  2. 在加载库成功的前提下,进一步要解析库中的函数符号,就是要找到这个函数接口,一般是一个函数指针
  3. 找到了函数地址之后,就可以调用并执行函数了,这就进入了函数体

楼主在2和3这两个阶段都踩了坑。

其实一开始我是在Qt Creator中先试着做了一个DLL,然后在Qt Creator下调用自己做的这个DLL。程序运行时要动态链接这个库了,结果library load成功,但是函数解析失败。具体原因我没有排查到,当时怀疑可能是这个DLL里面的函数名字发生了变化,曾试着使用一些工具查看这个DLL里面的具体函数,最终没有行得通,放弃了。


然后转向了VS下。这时制作出来的DLL已经能够解析函数成功了,但是程序运行时却崩溃了,提示我发生了段错误。


于是开始在VS下调试我这段代码。PS:此时是踩到了最大的这个坑。


同一段代码,在不同的IDE下编译器的解释确实不同,对语法的检查也不同。


经过调试之后,在VS下自己的测试用例已经跑得通了。


但是我的应用程序调用这个DLL还是段错误。此时非常纳闷,但很快想到了在我以往的经验中,段错误往往是跟对象空间扯上关系的,于是我想到了一个隐藏的错误。


我的DLL库,因为是C++代码,进行数据处理的那几个函数都封装成类的成员函数了,而应用程序在运行时绕过了类对象直接就调用成员函数了,这显然是不对的,因为成员函数必须通过类的实例来调用。想一想,类对象的空间根本就不存在,怎么能调用它的成员函数呢,这也就是引起段错误的原因。


所以这个可以说,是自己在库的设计上存在的问题。


最终去掉了类,直接裸露了函数接口,这个问题就解决了。PS:这样其实有点像C的风格,哈哈~

踩坑纪实(1):在Qt下开发了一段小算法,如何制作DLL动态链接库?踩坑纪实(1):在Qt下开发了一段小算法,如何制作DLL动态链接库? Eason_Grace 发布了34 篇原创文章 · 获赞 22 · 访问量 7145 私信 关注
上一篇:c++ qt 编译问题求解答


下一篇:qt creator源码全方面分析(4-6)