mingw编译出来的动态库的导入库可以直接在vc中直接使用,例如
#pragma comment(lib, "libx264.dll.a")
这样你就不需要生成一个.lib后缀的动态库的导入库了,网上也有如何从.dll生成.lib的方法。
如果链接了动态库的导入库libpthread.dll.a,你发布的应用程序就要带上pthread的dll。
使用静态库的好处是发布的应用程序组件模块里不需要带上相关的dll,如果要使用mingw编译出来的静态库,可以如下:
#pragma comment(lib, "libx264.a")
但是仅仅链接这么一个静态库是不够的,你还需要链接
libgcc.a
libmingwex.a
你可能还需要链接libmsvcrt.a
否则会报一堆错误:error LNK2001: 无法解析的外部符号
上面的这些库在C:\MinGW\lib目录或子目录下面可以找到。
链接这些库的原因是mingw使用的gcc编译器和vc编译器之间存在差异
先搞个 bat 把指定编译环境加到环境变量,比如下面就是 Qt5.12.5 + msvc2017 构建套件 + vs2019 的环境:
在最外层工程目录运行: qmake -tp vc -r 。会递归生成子目录的vcxproj,并生成总工程的sln。
这个最好是重新添加文件搞一个,直接点VS的那个升级会找不到Qt的相关头文件,会报一排错......
Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll。testdll.h文件源码如下:
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
// 此类是从 testdll.dll 导出的
class TESTDLL_API Ctestdll {
public:
Ctestdll(void)
public:
int Add(int a, int b) {return a+b}
int Sub(int a, int b) {return a-b}
int Mul(int a, int b) {return a*b}
}
extern TESTDLL_API int ntestdll
TESTDLL_API int fntestdll(void)
Qt如何使用这些动态链接库文件?
一、情况1,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (VS 2010)
Qt库是VS2010版本,VC++编译器生成的。所以工程可以直接使用testdll.h头文件和testdll.lib引入库文件。
1、把testdll.h拷贝到工程路径;
2、工程文件XXX.pro需要手动添加"HEADERS += testdll.h"和"LIBS += testdll.lib";
3、编译前,需要把lib文件:testdll.lib和testdll.dll一起拷贝到构建路径下面。
如此便可以正常使用VC++动态链接库函数。
二、情况2,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (MinGW 4.8.2)
Qt库是MinGW版本,gcc编译器生成,与VC++编译器不是同个体系。所以工程不可以使用testdll.h头文件和testdll.lib引入库文件。
对于调用DLL的方法,Qt本身就有相应的类来实现。
#include "dialog.h"
#include <QApplication>
#include <QLibrary>
typedef int (*func_Add)(int a, int b)//定义函数指针
typedef int (*func_Sub)(int a, int b)
typedef int (*func_Mul)(int a, int b)
int main(int argc, char *argv[])
{
QApplication a(argc, argv)
QLibrary mylib("testdll.dll")//testdll.dll的存放路径与.exe一致
if (mylib.load())
{
//"?Add@Ctestdll@@QAEHHH@Z"等字符串其实就是动态库函数int Add(int a, int b)的变体,请使用微软工具DEPENDS.EXE查看得到
func_Add f1 = (func_Add)mylib.resolve("?Add@Ctestdll@@QAEHHH@Z")
func_Sub f2 = (func_Sub)mylib.resolve("?Sub@Ctestdll@@QAEHHH@Z")
func_Mul f3 = (func_Mul)mylib.resolve("?Mul@Ctestdll@@QAEHHH@Z")
int rt = 0
if (f1 != NULL)
{
rt = f1(10, 12)
}
if (f2 != NULL)
{
rt = f2(10, 12)
}
if (f3 != NULL)
{
rt = f3(10, 12)
}
}
Dialog w
w.show()
return a.exec()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)