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

如何在调用add_custom_target时创建CMake变量以打包exe和dll?

解决CMake打包tar.gz时"tar: no files or directories specified"的问题

你的问题核心是**file(GLOB)在CMake配置阶段就执行了**,这时候编译还没开始,exe和dll文件尚未生成,导致DLL_FILES变量为空,tar命令没有可打包的文件。下面是几种可行的解决方案:

方案一:直接在tar命令中使用shell通配符(简单易用)

让tar命令在构建阶段(此时文件已生成)自行匹配目标文件,无需提前glob:

# 替换成你实际的可执行目标名称(比如add_executable定义的目标)
set(EXE_TARGET_NAME your_app)

add_custom_target(
    generate_tar
    WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
    COMMAND tar czf "output.tar.gz" *.exe *.dll
    COMMENT "打包可执行文件及依赖DLL为tar.gz"
)
# 关键:确保先编译出exe/dll,再执行打包
add_dependencies(generate_tar ${EXE_TARGET_NAME})

方案二:用Generator表达式精准获取目标文件(推荐,更可靠)

利用CMake的Generator表达式,直接引用可执行目标及其依赖的DLL(需要CMake 3.21+),避免通配符匹配无关文件:

add_executable(your_app src/main.cpp)
# 假设your_app通过target_link_libraries链接了依赖DLL

add_custom_target(
    generate_tar
    WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
    # $<TARGET_FILE:your_app> 展开为生成的exe路径
    # $<TARGET_RUNTIME_DLLS:your_app> 自动收集目标依赖的所有运行时DLL
    COMMAND tar czf "output.tar.gz" $<TARGET_FILE:your_app> $<TARGET_RUNTIME_DLLS:your_app>
    COMMENT "打包your_app及关联DLL为tar.gz"
)
add_dependencies(generate_tar your_app)

方案三:构建阶段动态执行glob(备选)

如果需要在构建阶段动态查找文件,可以通过cmake -E glob命令在打包时生成文件列表:

set(EXE_TARGET_NAME your_app)

add_custom_target(
    generate_tar
    WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
    # 生成文件列表
    COMMAND ${CMAKE_COMMAND} -E glob *.exe *.dll > file_list.txt
    # 从文件列表读取要打包的文件
    COMMAND tar czf "output.tar.gz" -T file_list.txt
    # 清理临时文件
    COMMAND ${CMAKE_COMMAND} -E remove file_list.txt
    COMMENT "动态查找并打包可执行文件及DLL"
)
add_dependencies(generate_tar ${EXE_TARGET_NAME})

内容的提问来源于stack exchange,提问作者LPo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:08