如何用CMake生成器表达式合并多个可执行文件的链接库语句?
用CMake生成器表达式批量为多个可执行文件链接库
问题场景
我定义了若干个可执行文件:
add_executable(exe1 ${DRIVERS_DIR}/exe1.cpp) add_executable(exe2 ${DRIVERS_DIR}/exe2.cpp) add_executable(exe3 ${DRIVERS_DIR}/exe3.cpp)
目前需要为这些可执行文件统一链接同一个库,写法是重复调用target_link_libraries:
target_link_libraries(exe1 ${LIB_NAME}) target_link_libraries(exe2 ${LIB_NAME}) target_link_libraries(exe3 ${LIB_NAME})
如何用生成器表达式将这三条语句替换为单条语句?
解决方案
你可以通过set_property结合生成器表达式实现单条语句批量设置链接库:
覆盖原有链接库配置
set_property(TARGET exe1 exe2 exe3 PROPERTY LINK_LIBRARIES $<1:${LIB_NAME}>)
追加链接库(不覆盖原有配置)
如果目标已经有其他链接库,需要追加而非覆盖,使用APPEND关键字:
set_property(TARGET exe1 exe2 exe3 APPEND PROPERTY LINK_LIBRARIES $<1:${LIB_NAME}>)
其中$<1:${LIB_NAME}>是生成器表达式,$<1:...>表示无条件展开后续内容,确保链接库名称在CMake配置阶段正确传递给所有指定的可执行目标。
更灵活的目标集合管理
若后续可能新增可执行目标,可先将所有目标存入变量,再统一处理:
set(EXE_TARGETS exe1 exe2 exe3) set_property(TARGET ${EXE_TARGETS} APPEND PROPERTY LINK_LIBRARIES $<1:${LIB_NAME}>)
内容的提问来源于stack exchange,提问作者user2052436
相关产品推荐
相关产品推荐

