1.编译库
明确一点,不同编译器编译出来的库不一定可以互相使用的,所以尽量你的库文件是使用同一个编译器编译出来。
首先找到你的qt所使用的编译器是哪个,一般会在QT的安装目录下的tools文件夹下,比如 D:\QT\Tools\mingw492_32,然后打开命令窗(win+r 输入,cmd,回车 ),进入到这个文件夹的bin目录里面。如下图
因为QT是用c++编译的,所以我们需要使用g++的编译命令,而不能用gcc。
将要编译的源文件放到编译器的根目录下(mingw492_32)
然后在命令窗下输入以下命令
g++.exe -shared -o ../hello.dll ../hello.c
然后目录下就会生成库文件了。
当然也有不顺利的情况:
1.如果是代码问题就自己改了。因为有的可以在gcc下编译成功,但是在g++下是不允许的,所以要按情况修改。
2. 报错 g++.exe: error: CreateProcess: No such file or directory ,这个大概率跟minGW有相关问题,可能环境变量上有其他的编译器,与这个g++本身冲突了。这时候上面的g++.exe的命令要用绝对路径
D:\QT\Tools\mingw492_32\g++.exe -shared -o ../hello.dll ../hello.c
2.往工程中添加库
这个网上有很多方法,这里就简单说下我的
将上述的库文件及头文件移到工程目录下的lib文件夹(没有就新建文件夹)
在pro文件中添加
INCLUDEPATH += $$PWD/lib
LIBS += $$PWD/lib/hello.dll
工程中把头文件添加进去
这样基本就完成了。这种方法可以添加动态库或者静态库都没问题
3.使用
在工程中#include "lib/hello.h",然后调用函数hello(22); 然后直接保存编译,运行查看结果
注意,如果在函数hello中使用printf ,它运行函数后是不会马上输出显示的,得程序结束后才会显示,可能是qt机制问题吧。
可能会有的报错或异常:
1.报错 error: undefined reference to `hello(int)'
这个有可能是链接库失败或者库中没有这个函数,具体可以查看底下状态栏下的编译输出。如果是用gcc编译的库有可能就会链接失败。
2.报错 xxx\hello.dll:-1: error: file not recognized: File format not recognized
collect2.exe:-1: error: error: ld returned 1 exit status
这个明确就写着链接失败,动态库不识别。基本问题就是qt使用的编译器跟编译出来的库使用的编译器不一致导致的。可能大家都是用minGW的编译器,但是版本不同它就是不可以,我也没脾气。
3.程序编译成功,但是运行后异常结束
这个找了很久,才发现是运行的时候没找到库导致异常,如果是debug模式下运行,那么把库文件放到debug文件夹下根目录就可以了
之后程序打包也记得将库放到目录下。