
自定义库静态库静态库的使用当第三方代码以源程序文件的形式提供时可以直接将文件加入项目进行编译。静态库则是将编译好的目标文件进行归档处理得到的库文件其特点是编译时会嵌入到可执行文件中无需在运行时额外加载。使用静态库时需要确保静态库的头文件和库文件都已正确添加到项目中并在编译链接时指定静态库的路径。大型软件项目中的使用对于大型软件项目使用动态库更为合适因为可以独立更新和维护库文件而不需要重新编译整个应用程序。例如VTK和OpenCV等大型软件库通常会被编译为动态库供其他项目使用。Qt Creator中的操作Qt Creator支持创建和管理静态库和动态库项目。无论是MSVC还是MinGW等编译器都可以在Qt Creator中创建相应的库文件。创建静态库在Qt中创建静态库的过程与创建共享库类似但有一些不同之处。下面是创建静态库的步骤步骤1创建一个新项目打开 Qt Creator。选择“新建项目”。选择“库”下的“C静态库”。点击“继续”根据提示设置项目名称和路径。步骤2设置项目文件.pro在项目的.pro文件中添加以下配置以指定创建静态库QT core QT - gui # 如果不需要GUI支持 CONFIG c11 # 选择C11标准 CONFIG staticlib # 指定为静态库 TARGET mystaticlibrary # 静态库名称步骤3编写代码创建一个头文件和实现文件。例如创建mymath.h和mymath.cpp。mymath.h#ifndefMYMATH_H#defineMYMATH_HclassMyMath{public:staticdoubleadd(doublea,doubleb);};#endif// MYMATH_Hmymath.cpp#includemymath.hdoubleMyMath::add(doublea,doubleb){returnab;}步骤4构建静态库在 Qt Creator 中选择构建Build按钮。选择“构建项目”以生成静态库。构建完成后你会在项目的输出目录通常是release或debug文件夹中找到生成的静态库文件.a或.lib。步骤5使用静态库要在其他 Qt 项目中使用这个静态库请按照以下步骤将生成的静态库文件复制到新的项目目录的某个位置。在新项目的.pro文件中添加如下配置INCLUDEPATH path/to/mylibrary # 头文件路径 LIBS -Lpath/to/mylibrary -lmystaticlibrary # 库文件路径在代码中包含头文件并调用库中的函数#includemymath.hintmain(){doubleresultMyMath::add(1.0,2.0);// ...}使用静态库步骤1创建一个新项目打开Qt Creator。选择“新建项目”。选择“库”下的“C静态库”。点击“继续”并设置项目名称和路径。步骤2设置项目文件.pro在项目的.pro文件中添加以下配置以指定创建静态库QT core QT - gui # 如果不需要GUI库 CONFIG c11 # 选择C11标准 CONFIG static # 指定为静态库 TARGET mylibrary # 静态库名称步骤3编写代码创建头文件和实现文件。例如创建mymath.h和mymath.cpp。mymath.h#ifndefMYMATH_H#defineMYMATH_HclassMyMath{public:staticdoubleadd(doublea,doubleb);};#endif// MYMATH_Hmymath.cpp#includemymath.hdoubleMyMath::add(doublea,doubleb){returnab;}步骤4构建静态库在Qt Creator中选择构建Build按钮。选择“构建项目”以生成静态库。构建完成后你会在项目的输出目录通常是release或debug文件夹中找到生成的静态库文件例如.a或.lib。步骤5使用静态库要在其他Qt项目中使用这个静态库请按照以下步骤将生成的静态库文件复制到新的项目目录的某个位置。在新项目的.pro文件中添加如下配置INCLUDEPATH path/to/mylibrary # 头文件路径 LIBS -Lpath/to/mylibrary -lmylibrary # 链接库文件在代码中包含头文件并调用库中的函数#includemymath.hintmain(intargc,char*argv[]){// 调用静态库中的函数doubleresultMyMath::add(1.0,2.0);// ...}动态库在Qt中动态库被称为共享库在 Windows 平台上就是动态链接库。共享库项目编译后生成后缀为“.dll”的动态链接库文件.dll文件是在应用程序运行时才被加载和调用的不像静态库那样在编译期间就被嵌入可执行文件。若更新了.dll 文件版本只要接口未变应用程序就可以正常调用动态链接库。动态库的使用动态库则是在运行时被链接和使用的库文件不会嵌入到可执行文件中。这种库的优势在于更新时无需重新编译整个项目灵活性更高。Qt项目在编译和运行时通常会使用到动态库。动态库的文件名后缀因平台和编译器不同而有所差异如Windows平台上的“.dll”文件。在Qt Creator中可以创建和管理动态库项目。创建共享库在Qt中创建共享库动态链接库比较简单。下面是创建共享库的步骤步骤1创建一个新项目打开Qt Creator。选择“新建项目”。选择“库”下的“C共享库”。点击“继续”并根据提示设置项目名称和路径。步骤2设置项目文件.pro在项目的.pro文件中添加以下配置以指定创建动态库QT core QT - gui # 如果不需要GUI库 CONFIG c11 # 选择C11标准 CONFIG shared # 指定为共享库 TARGET mylibrary # 共享库名称步骤3编写代码创建一个头文件和实现文件。例如创建mymath.h和mymath.cpp。mymath.h#ifndefMYMATH_H#defineMYMATH_H#includeQtCore/qglobal.h#ifdefined(MYMATH_LIBRARY)#defineMYMATH_EXPORTQ_DECL_EXPORT#else#defineMYMATH_EXPORTQ_DECL_IMPORT#endifclassMYMATH_EXPORTMyMath{public:staticdoubleadd(doublea,doubleb);};#endif// MYMATH_Hmymath.cpp#includemymath.hdoubleMyMath::add(doublea,doubleb){returnab;}步骤4构建共享库在Qt Creator中选择构建Build按钮。选择“构建项目”以生成共享库。构建完成后你会在项目的输出目录通常是release或debug文件夹中找到生成的共享库文件.dll、.so或.dylib。步骤5使用共享库要在其他Qt项目中使用这个共享库请按照以下步骤将生成的共享库文件复制到新的项目目录的某个位置或将其添加到系统路径。在新项目的.pro文件中添加如下配置INCLUDEPATH path/to/mylibrary # 头文件路径 LIBS -Lpath/to/mylibrary -lmylibrary # 库文件路径在代码中包含头文件并调用库中的函数#includemymath.hintmain(){doubleresultMyMath::add(1.0,2.0);// ...}使用共享库调用共享库也称为动态链接库DLL或so文件的方式有两种分别是显式链接和隐式链接。1、共享库的调用方式Qt支持使用共享库来组织和重用代码。共享库可以被多个程序共享减少内存占用和磁盘空间使用。显式链接在显式链接中程序在运行时加载共享库并且可以动态地使用库中的函数。你需要使用dlopen和dlsym来加载和调用库。**示例**假设有一个共享库libmymath.so其包含一个加法函数。// mymath.hexternCdoubleadd(doublea,doubleb);// mymath.cpp#includemymath.hexternCdoubleadd(doublea,doubleb){returnab;}使用显式链接#includeQCoreApplication#includeQDebug#includedlfcn.h// 用于Linux共享库intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);void*handledlopen(libmymath.so,RTLD_LAZY);if(!handle){qDebug()Cannot open library:dlerror();return1;}typedefdouble(*add_t)(double,double);add_t add(add_t)dlsym(handle,add);if(!add){qDebug()Cannot load symbol add:dlerror();dlclose(handle);return1;}doubleresultadd(1.0,2.0);qDebug()Result:result;dlclose(handle);returna.exec();}2、隐式链接调用共享库隐式链接是一种在编译时链接共享库的方法。在编译时编译器会知道库的存在并根据选择的编译选项来链接库。示例设置项目文件.pro来使用共享库。# myproject.pro TEMPLATE app TARGET MyApp QT core SOURCES main.cpp LIBS -L$$PWD/ -lmymath # 指定库路径和链接库名然后在代码中直接调用库中的方法#includeQCoreApplication#includeQDebug#includemymath.h// 包含头文件intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);doubleresultadd(1.0,2.0);// 直接调用qDebug()Result:result;returna.exec();}总结显式链接适合于需要在运行时决定是否加载库的场景。使用动态加载提供了更大的灵活性。隐式链接在编译时进行与标准的编译和链接过程相似通常用于更简单的情况。