Qt 调用第三方库
跨编译器的动态库
今天想用Qt去调用静态库,碰巧这个库又是用Vs生成的,于是乎...
使用Qt生成一个静态库,并使用Qt程序去调用,程序正常编译运行。但使用VS生成静态库,再使用Qt程序去调用,程序不能编译,错误File format not recognized (无法识别文件格式)
。然而使用Vs生成动态库,再使用Qt去调用,程序就能够正确编译和运行。其中Qt默认使用MinGw编译器。
那么是怎么回事呢?
静态库是编译未链接的产物,当编译可执行程序时会去链接静态库中的函数,由于使用了不同的编译器编译,因此会导致文件格式无法识别。
而动态库是已被编译和链接的资源,相比exe它只是没有入口main,即已经是一个能被机器解读的文件内容。在exe编译过程中只是去查找了外部声明,并没要把动态库的内容再次编译进去,因此能够编译通过。在exe运行时会把库内容拷贝到程序中,尽管动态库和可执行文件是两个不同的编译器,但是它们最终都是被翻译成了机器语言,因此程序可以调用库中函数运行。
使用动态库
在.pro文件中添加以下语句,指定动态库的导入库, 并在程序运行时把动态库拷贝到程序所在路径。
LIBS += $$PWD/lib/myfun.lib
使用静态库
在.pro文件中直接指定静态库
LIBS += $$PWD/lib/libmyfun.a