CMake中如何仅为Debug版本库启用ALPHA_DEBUG预编译宏?
问题解决:仅为Debug版本库添加预编译宏
问题出在add_definitions是全局命令,一旦调用会给后续所有编译目标添加预定义宏——哪怕你是在DEBUG分支里调用,之后的Production版本目标也会带上ALPHA_DEBUG。
解决核心是改用目标专属的编译定义命令,只给Debug版本的库单独添加宏,不会影响其他目标。
修改方案
把你代码里的add_definitions(-DALPHA_DEBUG)替换为target_compile_definitions,指定仅作用于Debug版本的库:
target_compile_definitions(debug_${arg1} PRIVATE ALPHA_DEBUG)
这里的PRIVATE表示该宏仅在当前库的编译过程中生效,不会传递给链接这个库的其他目标,是最贴合需求的选项。
修改后的完整代码
SET(ALPHA_PG_PATH ${CMAKE_SOURCE_DIR}/lib) SET(LIVE_PATH $ENV{HOME}/new_crypto) SET(LIB_PATH $ENV{HOME}/lib_hft/) macro(compile arg1) aux_source_directory(${arg1} ${arg1}_src) add_library(${arg1} SHARED ${${arg1}_src}) set(debug OFF) if (${ARGC} GREATER 1) if(${ARGV1} STREQUAL "DEBUG") set(debug ON) # 仅为Debug版本库添加专属预编译宏 target_compile_definitions(debug_${arg1} PRIVATE ALPHA_DEBUG) add_library(debug_${arg1} SHARED ${${arg1}_src}) if (${ARGC} GREATER 2) set(list ${ARGN}) list (SUBLIST list 1 -1 list_new) target_link_libraries(${arg1} ${list_new} config++) target_link_libraries(debug_${arg1} ${list_new} config++) else() target_link_libraries(${arg1} util_cpp config++) target_link_libraries(debug_${arg1} config++) endif() else() target_link_libraries(${arg1} ${ARGN} config++) endif() endif() endmacro(compile)
兼容旧版本CMake的备选方案
如果你的CMake版本低于3.0(不推荐),可以用set_target_properties配合属性设置实现相同效果:
set_target_properties(debug_${arg1} PROPERTIES COMPILE_DEFINITIONS "ALPHA_DEBUG")
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

