如何在CMake中为多个目标/可执行文件链接同一组库?
解决CMake多可执行文件重复链接库的简洁写法
针对多可执行文件需要链接同一组库的场景,有几种简洁的实现方式:
方式一:直接遍历目标列表(最常用)
先定义所有要生成的可执行目标名称,通过foreach循环一次性完成可执行文件创建和库链接操作,代码最简洁:
set(ALL_LIBS lib1 lib2 lib3) # 定义所有可执行目标的名称列表 set(EXEC_TARGETS program1 program2 program3 program4) foreach(TARGET IN LISTS EXEC_TARGETS) # 假设每个目标对应的源文件是「目标名.cpp」,如果不是可自行修改源文件名 add_executable(${TARGET} ${TARGET}.cpp) target_link_libraries(${TARGET} PRIVATE ${ALL_LIBS}) endforeach()
方式二:适配源文件与目标名不匹配的场景
如果部分可执行文件的源文件不止一个,或者源文件名和目标名不一致,可以用配对列表的方式处理:
set(ALL_LIBS lib1 lib2 lib3) # 按「目标名 源文件列表」的格式定义配对项 set(EXEC_TARGET_SOURCES program1 program1.cpp program2 program2.cpp utils.cpp program3 main_program3.cpp ) # 遍历配对列表,每次提取目标名和对应的源文件 foreach(TARGET_INFO IN ZIP_LISTS EXEC_TARGET_SOURCES) list(GET TARGET_INFO 0 TARGET_NAME) list(REMOVE_AT TARGET_INFO 0) add_executable(${TARGET_NAME} ${TARGET_INFO}) target_link_libraries(${TARGET_NAME} PRIVATE ${ALL_LIBS}) endforeach()
方式三:自定义封装函数
如果需要频繁创建这类可执行文件,可以封装一个自定义函数,把创建和链接逻辑打包:
set(ALL_LIBS lib1 lib2 lib3) # 自定义函数:创建可执行文件并自动链接指定库 function(add_linked_executable TARGET) add_executable(${TARGET} ${ARGN}) target_link_libraries(${TARGET} PRIVATE ${ALL_LIBS}) endfunction() # 直接调用自定义函数创建可执行文件 add_linked_executable(program1 program1.cpp) add_linked_executable(program2 program2.cpp) add_linked_executable(program3 program3.cpp) add_linked_executable(program4 program4.cpp)
内容的提问来源于stack exchange,提问作者pom_jam
相关产品推荐
相关产品推荐

