如何将链接库与MinGW依赖库复制到可执行文件输出目录?
解决方案
1. 复制自定义库 mylib 到可执行文件目录
修改 mytestconsole/CMakeLists.txt,添加构建后复制命令:
add_custom_command(TARGET mytestconsole POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:mylib> $<TARGET_FILE_DIR:mytestconsole> COMMENT "复制mylib动态库到可执行文件目录" )
$<TARGET_FILE:mylib>:自动获取mylib生成的DLL文件路径$<TARGET_FILE_DIR:mytestconsole>:自动获取mytestconsole.exe所在的输出目录copy_if_different:仅当文件有变化时才复制,避免重复操作
2. 复制MinGW运行时库到可执行文件目录
利用CMake 3.21+支持的file(GET_RUNTIME_DEPENDENCIES)命令收集依赖,结合脚本实现复制:
步骤1:在mytestconsole/CMakeLists.txt中添加命令
add_custom_command(TARGET mytestconsole POST_BUILD COMMAND ${CMAKE_COMMAND} -D EXE_PATH=$<TARGET_FILE:mytestconsole> -D DEST_DIR=$<TARGET_FILE_DIR:mytestconsole> -P ${CMAKE_SOURCE_DIR}/copy_mingw_libs.cmake COMMENT "复制MinGW运行时库到可执行文件目录" )
步骤2:在项目根目录创建copy_mingw_libs.cmake脚本
file(GET_RUNTIME_DEPENDENCIES EXECUTABLES ${EXE_PATH} RESOLVED_DEPENDENCIES_VAR RESOLVED_LIBS UNRESOLVED_DEPENDENCIES_VAR UNRESOLVED_LIBS ) foreach(LIB ${RESOLVED_LIBS}) # 筛选需要的MinGW运行时库 if(LIB MATCHES "libgcc_s_seh-1\\.dll$" OR LIB MATCHES "libstdc\\+\\+-6\\.dll$" OR LIB MATCHES "libwinpthread-1\\.dll$") file(COPY ${LIB} DESTINATION ${DEST_DIR} ONLY_IF_DIFFERENT) endif() endforeach()
3. 修正install命令的默认安装路径(可选)
若不想让install命令默认安装到Program Files,可在顶层CMakeLists.txt开头添加:
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/install" CACHE PATH "安装目录" FORCE)
或在配置项目时通过命令行指定:
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=./install
这样安装文件会被放到项目根目录的install文件夹中。
原错误说明
你使用的LIST_PREREQUISITES是CMake内部file命令的子命令(需通过file(LIST_PREREQUISITES)调用),并非系统可执行命令,因此直接作为add_custom_command的COMMAND参数会报错。
内容的提问来源于stack exchange,提问作者GoodSimon
相关产品推荐
相关产品推荐

