cmake扩展(5)——file命令排除部分文件

在cmake中可以使用file命令获取需要的文件,并且支持正则/通配符,使用起来还是很方便的。

#语法
 file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])

#example
file(GLOB_RECURSE SOURCES "src/*.h" "src/*.cpp" "src/*.ui")

但是由于file命令并不包含exclude这样的参数,所以无法排除某个文件,比如对于下面的目录:

我们本来可以使用

file(GLOB_RECURSE SOURCES "src/*")

获取所有文件(1,2,3,4.cpp,5.cpp)。而我们如果想要排除cpp文件的话,无法直接排除。

但是因为file命令获得的变量是一个列表,所以可以借助list命令进行排除:

list(REMOVE_ITEM <list> <value> [<value> ...])

list的REMOVE_ITEM命令表示从list中移除部分元素内容,需要注意的是不支持正则/统配符.

因此我们不能使用

list(REMOVE_ITEM SOURCES "src/*.cpp")

这样的方式。

我们仍然需要借助file命令,将"src/*.cpp"的全部文件的完整名称获取到:

file(GLOB_RECURSE REMOVE_SOURCES "src/*.cpp")

然后在使用list命令

list(REMOVE_ITEM SOURCES ${REMOVE_SOURCES})

这样,就可以排除掉不需要的文件啦。

完整cmakelist.txt如下:

cmake_minimum_required(VERSION 3.27)
project(foreachTest)

variable_watch(SOURCES)
file(GLOB_RECURSE SOURCES "src/*")
file(GLOB_RECURSE REMOVE_SOURCES "*.cpp")
message("REMOVE_SOURCES:" ${REMOVE_SOURCES})
list(REMOVE_ITEM SOURCES ${REMOVE_SOURCES})

打印内容如下:

 Variable "SOURCES" was accessed using MODIFIED_ACCESS with value
  "E:/个人/project/cmake/test04/06/src/1;E:/个人/project/cmake/test04/06/src/2;E:/个人/project/cmake/test04/06/src/3;E:/个人/project/cmake/test04/06/src/4.cpp;E:/个人/project/cmake/test04/06/src/5.cpp".


REMOVE_SOURCES:E:/个人/project/cmake/test04/06/build/CMakeFiles/3.27.0/CompilerIdCXX/CMakeCXXCompilerId.cppE:/个人/project/cmake/test04/06/src/4.cppE:/个人/project/cmake/test04/06/src/5.cpp
CMake Debug Log at CMakeLists.txt:8 (list):
  Variable "SOURCES" was accessed using READ_ACCESS with value
  "E:/个人/project/cmake/test04/06/src/1;E:/个人/project/cmake/test04/06/src/2;E:/个人/project/cmake/test04/06/src/3;E:/个人/project/cmake/test04/06/src/4.cpp;E:/个人/project/cmake/test04/06/src/5.cpp".


CMake Debug Log at CMakeLists.txt:8 (list):
  Variable "SOURCES" was accessed using MODIFIED_ACCESS with value
  "E:/个人/project/cmake/test04/06/src/1;E:/个人/project/cmake/test04/06/src/2;E:/个人/project/cmake/test04/06/src/3". 

 

### 解决CMake配置失败并使用CMake Debugger进行调试 当遇到 **CMake configuration failed** 的问题时,通常是因为环境设置不正确、依赖项缺失或配置文件中的参数错误。以下是关于如何排查此问题以及如何通过 CMake Debugger 进行调试的详细说明。 #### 1. 检查基本环境和工具链 确保开发环境中已安装必要的构建工具和编译器。对于Linux平台上的VS Code+CMake项目,需验证以下条件是否满足: - 安装了支持的CMake版本(建议至少为3.10以上)[^1]。 - 配置了正确的编译器路径,在 `.vscode/c_cpp_properties.json` 中指定MSVC或其他兼容编译器的位置[^3]。 如果未正确配置编译器路径,则可能导致无法找到所需的头文件或库链接失败等问题。 #### 2. 创建与初始化构建目录 按照标准流程创建独立的构建目录来执行CMake命令。例如: ```bash cd /path/to/project_root mkdir build && cd build cmake .. ``` 针对特定需求调整选项时可以加入额外标志,比如启用Clang作为替代GCC/G++的编译器: ```bash cmake .. \ -DCMAKE_CXX_COMPILER=$(which clang++) \ -DCMAKE_C_COMPILER=$(which clang) \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON ``` 上述操作有助于排除因默认编译器选择不当引起的错误[^2]。 #### 3. 使用CMake Tools扩展简化工作流 Visual Studio Code提供了专门用于管理基于CMake项目的插件——“CMake Tools”。它能够自动处理许多繁琐的任务,包括但不限于生成makefiles/ninja scripts、运行configure过程等。 要激活这些功能,请先确认已在IDE内部启用了该扩展,并按提示完成初始向导步骤。之后可以通过快捷菜单重新尝试Configure动作以定位潜在问题所在位置。 #### 4. 调试技巧:利用CMake Debug模式深入分析 一旦发现常规方法仍无法解决问题,可考虑开启更详细的日志记录以便进一步诊断原因。修改调用方式如下所示增加verbosity level: ```bash cmake -DVERBOSE=1 .. ``` 或者直接编辑对应的task definition(`tasks.json`)添加相应flags: ```json { "label": "build", "type": "shell", "command": "cmake", "args": [ "--build", ".", "-v" ] } ``` 这样可以获得更加详尽的过程描述从而便于识别具体哪个环节出了差错。 另外值得注意的是,某些情况下可能还需要手动检查是否有遗漏掉的重要第三方包;亦或是目标平台上存在权限不足的情况阻止正常访问资源等情况发生。 --- ### 提供一段简单的Python脚本辅助解析log信息(选填部分) 下面给出一个小例子展示怎样编写一小段程序帮助过滤冗长的日志输出只保留关键字相关内容: ```python import re def filter_cmake_logs(log_file_path, keyword='error'): filtered_lines = [] try: with open(log_file_path,'r') as f: lines=f.readlines() pattern=re.compile(rf'.*{keyword}.*') for line in lines: match_result=pattern.match(line.strip()) if match_result is not None: filtered_lines.append(match_result.group()) except Exception as e: print(f"Error occurred while processing file {e}") return filtered_lines if __name__=="__main__": results=filter_cmake_logs('./config.log','failed') for r in results: print(r) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值