You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GLOB_RECURSE与set_source_files_properties修改C文件编译属性无效问题

解决CMake中修改.c文件编译语言为CXX的问题

我来帮你排查并解决这个问题——你遇到的核心问题主要有两个:一是get_source_file_property返回NOTFOUND的原因,二是GLOB_RECURSE配合set_source_files_properties不生效的潜在问题。

先解释为什么get_source_file_property返回NOTFOUND

CMake的get_source_file_property只有在文件已经被关联到某个构建目标(比如add_executable/add_library),或者已经通过set_source_files_properties显式设置过属性时,才能获取到对应的属性值。你在调用它的时候,目标文件既没被添加到任何目标,也没被设置过属性,所以CMake返回NOTFOUND是正常的。

正确修改.c文件编译语言的步骤

下面是经过验证的可行方案,你可以按这个思路调整你的CMakeLists.txt:

  1. 先确认GLOB_RECURSE是否正确获取到了目标文件
    很多时候路径问题会导致GLOB没找到文件,先添加打印语句验证:

    file(GLOB_RECURSE c_sources "*.c")
    # 打印找到的所有.c文件,确认是否包含你要修改的examples/one/file.c
    message(STATUS "Found C source files: ${c_sources}")
    

    如果没找到目标文件,可能是你当前的CMakeLists.txt不在项目根目录,需要调整GLOB的路径,比如从根目录开始递归查找:

    file(GLOB_RECURSE c_sources "${CMAKE_SOURCE_DIR}/**/*.c")
    

    (注:**递归匹配需要CMake 3.12及以上版本支持)

  2. 批量设置源文件的LANGUAGE属性(无需foreach循环)
    set_source_files_properties本身支持一次性给多个文件设置属性,不用写foreach循环,更简洁:

    # 先获取所有.c文件
    file(GLOB_RECURSE c_sources "${CMAKE_SOURCE_DIR}/**/*.c")
    # 批量设置这些文件的编译语言为CXX
    set_source_files_properties(${c_sources} PROPERTIES LANGUAGE CXX)
    
  3. 验证属性是否设置成功
    可以在设置属性后,循环打印每个文件的属性值确认:

    foreach(c_file ${c_sources})
        get_source_file_property(file_lang ${c_file} LANGUAGE)
        message(STATUS "File ${c_file} will be compiled as: ${file_lang}")
    endforeach()
    
  4. 关键:设置属性必须在添加文件到目标之前
    一定要确保set_source_files_properties的调用在add_executable/add_library之前,否则CMake已经确定了文件的编译语言,后续修改属性不会生效。完整的流程示例:

    # 1. 获取所有.c文件
    file(GLOB_RECURSE c_sources "${CMAKE_SOURCE_DIR}/**/*.c")
    # 2. 设置编译语言为CXX
    set_source_files_properties(${c_sources} PROPERTIES LANGUAGE CXX)
    # 3. 验证设置结果
    foreach(c_file ${c_sources})
        get_source_file_property(file_lang ${c_file} LANGUAGE)
        message(STATUS "File ${c_file} language: ${file_lang}")
    endforeach()
    # 4. 将文件添加到构建目标
    add_executable(my_example_target ${c_sources})
    

额外提示:避免GLOB的陷阱

用GLOB_RECURSE虽然方便,但CMake不会自动检测后续新增的.c文件——如果你之后添加了新的.c文件,需要手动重新运行CMake才能让它被识别。如果是长期维护的项目,建议手动列出所有源文件,而不是依赖GLOB。

内容的提问来源于stack exchange,提问作者João Neto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:16:12