[✔️]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(" "))


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

目录
相关文章
|
4月前
|
JavaScript Linux
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
127 1
which-find命令,which cd 指令可以查看指令的存放位置,find命令相当于文件的搜索框,find / -name “test“,从目录 / 开始进行搜索, 按照文件名搜索,搜索test
which-find命令,which cd 指令可以查看指令的存放位置,find命令相当于文件的搜索框,find / -name “test“,从目录 / 开始进行搜索, 按照文件名搜索,搜索test
|
4月前
|
Linux Perl
linux 批量查找并替换文件里的指定字符串,linux 批量查找并替换当前目录下所有子目录内文件里的指定字符串
linux 批量查找并替换文件里的指定字符串,linux 批量查找并替换当前目录下所有子目录内文件里的指定字符串
42 0
|
5月前
|
Shell Linux
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
52 0
|
6月前
|
Shell
grep 搜索当前文件夹下的所有子文件中的文件是否包含8888字符串的命令
要在当前文件夹及其所有子文件夹中的文件中搜索包含字符串 "8888" 的文件,你可以使用 grep 命令结合 -r 或 -R 选项(表示递归搜索)。这里是具体的命令: bash grep -r "8888" . 其中: -r 或 -R:递归搜索。 "8888":你要搜索的字符串。 .:表示当前目录。 这个命令会列出所有包含字符串 "8888" 的文件的名称以及匹配的行。如果你只想看到文件名,而不看具体的匹配行,可以加上 -l 选项: bash grep -rl "8888" . 这样,命令只会输出包含字符串 "8888" 的文件名。
104 1
|
Shell Perl
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行。
97 1
linux grep命令反向查找【匹配不是XXX的行内容】
linux grep命令反向查找【匹配不是XXX的行内容】
|
API Windows
[✔️]命令行选项的符号释义
[✔️]命令行选项的符号释义
93 0
glob库:文件名的匹配
glob库:文件名的匹配
173 2
glob库:文件名的匹配
|
机器学习/深度学习 移动开发 Go
正则表达式使用说明(包含find命令与grep命令)
正则表达式使用说明(包含find命令与grep命令)
160 0