同一目录下多目标复用源文件时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
相关产品推荐
相关产品推荐

