导语 在日常开发过程中难免会使用到第三方库或者需要将部分库分离另外存储,如果将库与代码放在一起难免会造成工程庞大,此时就可以采用将库与源码分离的方式,在编译时根据情况来判断是否需要下载。步骤 下面来解析下具体操作步骤,以下以oracleoci库下载为例。UNSET命令初始化本次编译用到的参数变量初始化oci库压缩包路径参数LOCALOCILIBZIPUNSET(LOCALOCILIBZIPCACHE)初始化oci库解压路径参数LOCALOCILIBDIRUNSET(LOCALOCILIBDIRCACHE)初始化oci库压缩包下载路径参数LOCALOCILIBZIPDLDIRUNSET(LOCALOCILIBZIPDLDIRCACHE)SET命令设置参数初始路径或名称设置oci库存放文件夹名称SET(OCILIBNAMEocix86lib)设置oci库压缩包解压文件夹名称SET(OCILIBUNZIPDIRNAME{OCILIBNAME})设置oci库头文件存放文件夹名称SET(LOCALOCIINCLUDEDIRNAMEociinclude)设置oci库压缩包名称SET(OCILIBZIPNAMEocilib。tar。gz)设置oci库远程下载地址URLSET(OCILIBDOWNLOADURLhttp:xxxxxxocilib。tar。gz)设置oci库远程下载超时时间SET(DOWNLOADOCILIBTIMEOUT600CACHESTRINGTimeoutinsecondswhendownloadingocilib。)FINDFILE命令在路径下查找对应名称文件或文件夹是否存在,判断库是否已经下载或解压判断压缩包在文件夹oraocilib下是否已经存在FINDFILE(LOCALOCILIBZIPNAMES{OCILIBZIPNAME}PATHSoraocilibNODEFAULTPATH)判断压缩包在文件夹oraocilib下是否已经解压FINDFILE(LOCALOCILIBDIRNAMES{OCILIBNAME}PATHSoraocilibNODEFAULTPATH)判断压缩包下载路径FINDFILE(LOCALOCILIBZIPDLDIRNAMESPATHSoraocilibNODEFAULTPATH)MESSAGE命令输出相应步骤的提示信息输出当前正进行的操作步骤信息MESSAGE(STATUSCheckingdblink{OCILIBUNZIPDIRNAME}{LOCALOCILIBZIP}。。。。。)判断当前压缩包是否存在,如果不存在则开始根据设定的URL地址进行下载判断压缩包是否已经存在IF(NOTLOCALOCILIBZIP)不存在则进行下载操作,输出操作提示信息MESSAGE(STATUSDownloading{OCILIBZIPNAME}to{LOCALOCILIBZIPDLDIR})从设定URL地址下载相应的压缩包FILE(DOWNLOAD{OCILIBDOWNLOADURL}{LOCALOCILIBZIPDLDIR}{OCILIBZIPNAME}TIMEOUT{DOWNLOADOCILIBTIMEOUT}STATUSERRSHOWPROGRESS)判断下载是否存在错误IF(ERREQUAL0)如果下载无错误则设置压缩包名称标记下载成功SET(LOCALOCILIBZIP{LOCALOCILIBZIPDLDIR}{OCILIBZIPNAME})ELSE()下载错误输出相关的提示信息MESSAGE(STATUSDownloadfailed,error:{ERR})MESSAGE(FATALERRORYoucantrydownloading{OCILIBDOWNLOADURL}manuallyusingcurlwgetorasimilartool)ENDIF()ENDIF()根据设定标记判断是否下载成功,如果下载成功则对压缩包文件进行初步的校验,无问题则进行解压缩操作IF(LOCALOCILIBZIP)输出相应的提示信息校验解压路径等MESSAGE(STATUSCheckingdblink{OCILIBUNZIPDIRNAME}{LOCALOCIINCLUDEDIRNAME}{LOCALOTLINCLUDEDIRNAME})IF(NOTEXISTS{LOCALOCILIBZIPDLDIR}{OCILIBUNZIPDIRNAME}ORNOTEXISTS{LOCALOCILIBZIPDLDIR}{LOCALOCIINCLUDEDIRNAME}ORNOTEXISTS{LOCALOCILIBZIPDLDIR}{LOCALOTLINCLUDEDIRNAME})输出提示信息准备进行解压缩MESSAGE(STATUScd{LOCALOCILIBZIPDLDIR};tarxfz{LOCALOCILIBZIP})获取已下载的压缩包大小做基本的判断GETFILESIZE({LOCALOCILIBZIP}LOCALZIPSIZE)如果压缩包大小为0则输出对应的错误信息IF(LOCALZIPSIZEEQUAL0)移除损坏压缩包,重置相应的参数FILE(REMOVE{LOCALOCILIBZIP})UNSET(LOCALOCILIBZIP)UNSET(LOCALOCILIBZIPCACHE)MESSAGE(FATALERROR{OCILIBZIPNAME}iszerolength。Deletingit。)ELSE()下载文件基本无问题,进入解压路径开始解压压缩包EXECUTEPROCESS(COMMAND{CMAKECOMMAND}Etarxfz{LOCALOCILIBZIP}WORKINGDIRECTORY{LOCALOCILIBZIPDLDIR}RESULTVARIABLEtarresult)判断解压是否成功IF(tarresultMATCHES0)解压成功设置成功标记参数SET(OCILIBFOUND1CACHEINTERNAL)ELSE()解压失败输出相应错误提示信息MESSAGE(STATUSFailedtoextractfiles。Pleasetrydownloadingandextractingyourself。Theurlis:{OCILIBDOWNLOADURL})ENDIF()ENDIF()ENDIF()ENDIF()至此第三方库已经下载解压完成,后续可以根据自己源码,设置对应的链接路径进行编译INCLUDEDIRECTORIES命令可以设置引用头文件包括路径LINKDIRECTORIES命令可以设置引用第三方库文件所在路径编译完成后可以使用INSTALL命令将后续应用运行时需要使用的库,拷贝到指定的安装目录CMAKEINSTALLPREFIX为设置的安装路径OCILIBNAME为库放置文件夹copylibINSTALL(FILES{allCopyFiles}DESTINATION{CMAKEINSTALLPREFIX}{OCILIBNAME})