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

同一目录下多目标复用源文件时CMake源文件编译选项合并问题求助

同一目录下多目标复用源文件时CMake源文件编译选项合并问题求助

我最近写了个CMake工具函数my_tool_func(),它是基于CMake API实现的,核心功能就是给用户指定的目标,针对单个源文件注入专属的编译选项。本来测试的时候一切正常,可一旦用户(或者我的矩阵测试套件)在同一个CMakeLists.txt里创建多个目标,而且这些目标都复用同一个源文件的时候,麻烦就找上门了——CMake居然会把这些源文件层面的属性合并到一起!结果每个目标最后都拿到了所有目标的编译选项合集,完全偏离了预期效果。

最小可复现示例

源文件 test.cpp

// test.cpp
#include <iostream>

int main() {
#ifdef MODE_A
    std::cout << "Mode A enabled" << std::endl;
#elif defined(MODE_B)
    std::cout << "Mode B enabled" << std::endl;
#else
    std::cout << "Default mode" << std::endl;
#endif
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(MultiTargetCompileIssue)

# 我写的工具函数,给指定目标的源文件注入编译宏
function(my_tool_func TARGET SRC_FILE DEFINE)
    set_source_files_properties(${SRC_FILE} PROPERTIES COMPILE_DEFINITIONS ${DEFINE})
    target_sources(${TARGET} PRIVATE ${SRC_FILE})
endfunction()

# 创建两个目标,复用同一个test.cpp
add_executable(TargetA)
my_tool_func(TargetA test.cpp MODE_A)

add_executable(TargetB)
my_tool_func(TargetB test.cpp MODE_B)

实际构建运行后你会发现,不管是TargetA还是TargetB,输出的结果都不对——因为CMake把test.cpp的COMPILE_DEFINITIONS属性合并了,两个宏MODE_A和MODE_B会被同时定义,导致代码里的条件判断完全失效。

我本来的需求是,同一个源文件在不同目标里使用时,能拥有独立的编译选项,互不干扰。试过直接用target_compile_definitions给目标加,但这是目标层面的设置,不符合我工具函数要针对单个源文件注入选项的设计初衷。有没有大佬能给我支个招,怎么解决这个CMake源文件属性被合并的问题?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:53:11