[✔️]cmake command 无法使用通配符匹配文件,只能检索下目录指定文件

简介: [✔️]cmake command 无法使用通配符匹配文件,只能检索下目录指定文件

问题背景


工程中使用了第三方库,在编译链接阶段,lib是不可缺少的,有2种方式可以保证编译链接的正常:


  • lib必须copy到库引用目录


  • 引用lib的绝对路径也行


但是当程序运行的时候,使用的是对应的dll,所以必须将对应的dll放在应用程序目录。


实际举例


比如cocos2dx使用的curl,在cmake中通过target_link_libraries引用lib的绝对路径


image.png


而对于dll,在非CMAKE生成的win32工程里面,是在生成事件里面配置了copy dll的逻辑,在copy的时候,是将整个目录copy了过去。


因为是手动配置的生成事件,并且里面可以使用bat脚本,而bat脚本是支持通配符的,所以我惊奇的发现,debug、release的生成事件是有差异的,这里就比较坑了,细节的配置。


这篇文章详细介绍如何解决cmake项目dll、lib的copy的问题,但是发布release版本的时候,只需要dll就行了,增加lib只会占用软件的包体。


比如上边的win32目录,但是这个目录里面同时包含了lib、dll,如果Command支持通配符的话,那么就没有后续问题了。


CMAKE的COMMAND大部分都是不支持通配符匹配的


add_custom_commandCOMMANDcopy_directoryremove都是不支持通配符的


解决办法


因为编译链接使用的lib是绝对路径,所以exe同目录有没有lib都不会影响编译。


要想exe同目录不出现lib,解决思路有:


  1. 不进行整个目录的copy,改用copy file


  1. 如果copy目录后,删除相应的lib


我这里选择了第二种方式,因为lib文件比较多,所以编写了个nodejs脚本处理:


const fs = require("fs")
const path = require("path")
const result = fs.readdirSync(__dirname)
let arr = [];
for (let i = 0; i < result.length; i++) {
    const r = result[i];
    const ext = path.extname(r)
    if (ext === '.lib') {
        arr.push(r);
    }
}
arr = arr.map(item => `$(outdir)${item}`);
console.log(arr.join(" "))


目前暂时没有找到更好的办法。

目录
相关文章
|
8天前
|
Shell
grep 搜索当前文件夹下的所有子文件中的文件是否包含8888字符串的命令
要在当前文件夹及其所有子文件夹中的文件中搜索包含字符串 "8888" 的文件,你可以使用 grep 命令结合 -r 或 -R 选项(表示递归搜索)。这里是具体的命令: bash grep -r "8888" . 其中: -r 或 -R:递归搜索。 "8888":你要搜索的字符串。 .:表示当前目录。 这个命令会列出所有包含字符串 "8888" 的文件的名称以及匹配的行。如果你只想看到文件名,而不看具体的匹配行,可以加上 -l 选项: bash grep -rl "8888" . 这样,命令只会输出包含字符串 "8888" 的文件名。
|
10月前
|
Linux Perl
Linux 中如何对变量进行切分截取?获取文件的扩展名
Linux 中如何对变量进行切分截取?获取文件的扩展名
87 0
|
11月前
|
Shell Perl
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行。
59 1
|
12月前
|
API Windows
[✔️]命令行选项的符号释义
[✔️]命令行选项的符号释义
65 0
|
机器学习/深度学习 移动开发 Go
正则表达式使用说明(包含find命令与grep命令)
正则表达式使用说明(包含find命令与grep命令)
117 0
glob库:文件名的匹配
glob库:文件名的匹配
136 2
glob库:文件名的匹配
|
Linux 数据库 Windows
linux中的chgrp改变所属组、修改bigbig.txt文件所属主用户拥有读写权限,并使其他用户具有写执行权限、find查找文件或者目录、locate快速定位文件路径、grep 过滤查找及“|”管道符、gzip/gunzip 压缩、zip/unzip 压缩
chgrp [最终用户组] [文件或目录] (功能描述:改变文件或者目录的所属组)第一种方式 chmod [{ugoa}{±=}{rwx}] 文件或目录。第一种方式 chmod [{ugoa}{±=}{rwzip [选项] XXX.zip 将要压缩的内容 (功能描述:压缩文件和目录的命令)zip 压缩命令在windows/linux都通用,可以压缩目录且保留源文件。gzip 文件 (功能描述:压缩文件令下。linux常用命locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给 定的文件。Locate 指令无需遍历整个文件系统,查询速度较快。为了保
182 1
linux中的chgrp改变所属组、修改bigbig.txt文件所属主用户拥有读写权限,并使其他用户具有写执行权限、find查找文件或者目录、locate快速定位文件路径、grep 过滤查找及“|”管道符、gzip/gunzip 压缩、zip/unzip 压缩
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
|
Shell Linux C++
linux shell之paste合并文件和找到匹配的文件里面替换内容(find和-exec或xargs组合)
linux shell之paste合并文件和找到匹配的文件里面替换内容(find和-exec或xargs组合)
189 0
|
Perl 应用服务中间件 nginx

热门文章

最新文章