cmake通过add_custom_command复制DLL及配置文件

15 篇文章 0 订阅

https://zhuanlan.zhihu.com/p/661284935

#设置依赖的QT DLL及外部DLL拷贝名、配置文件
set(PROJECT_REQUIRED_QT5_DLL Core Gui Widgets SerialPort)
set(PROJECT_REQUIRED_DLL
        FileImport.dll ECGAlgInterface.dll
        WebView2Loader.dll McsfLogger.dll McsfSystemEnvironmentConfig.dll xerces-c_3_2.dll
        mysqlcppconn-9-vs14.dll libcrypto-3-x64.dll libssl-3-x64.dll
        7z.dll 7z.exe
)
set(PROJECT_REQUIRED_CONF ApplicationConfig LoggerClientConfig)

#设置QT目录
set(CMAKE_PREFIX_PATH D:/Library/Qt5.14.2/5.14.2/msvc2017_64/lib/cmake)
message(STATUS "CMAKE_PREFIX_PATH is ${CMAKE_PREFIX_PATH}")

#设置依赖库系统变量
message(STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
set(PROJECT_LIBRARY_DIR ${PROJECT_SOURCE_DIR}/Library)
set(PROJECT_LIBRARY_INCLUDE_DIR ${PROJECT_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/include)
set(PROJECT_LIBRARY_LIB_DIR ${PROJECT_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/lib)
set(PROJECT_LIBRARY_DLL_DIR ${PROJECT_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/dll)
message(STATUS "PROJECT_LIBRARY_DIR is ${PROJECT_LIBRARY_DIR}")
message(STATUS "PROJECT_LIBRARY_INCLUDE_DIR is ${PROJECT_LIBRARY_INCLUDE_DIR}")
message(STATUS "PROJECT_LIBRARY_LIB_DIR is ${PROJECT_LIBRARY_LIB_DIR}")
message(STATUS "PROJECT_LIBRARY_DLL_DIR is ${PROJECT_LIBRARY_DLL_DIR}")
message(STATUS "====================set_qt_compile.cmake===================")

message(STATUS "WIN32 is ${WIN32}")
message(STATUS "CMAKE_TOOLCHAIN_FILE is ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS "MSVC is ${MSVC}")


if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(DEBUG_SUFFIX)
    if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif ()

    #往上跳2级找到bin目录
    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()

    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
    endif ()

    #拷贝QT的DLL
    foreach (QT_LIB ${PROJECT_REQUIRED_QT5_DLL})
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/bin/Qt5${QT_LIB}${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
        message(STATUS "COPY QT_LIB ${QT_LIB}")
    endforeach (QT_LIB)

    #拷贝依赖的DLL和exe
    foreach (MY_DLL  ${PROJECT_REQUIRED_DLL})
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            "${PROJECT_LIBRARY_DLL_DIR}/${MY_DLL}"
            "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
            message(STATUS "COPY ST_DLL ${MY_DLL}")
    endforeach (MY_DLL)

    #拷贝配置文件,先建目录,再拷贝config文件
    #创建config文件夹
    message(STATUS "config path is ${PROJECT_SOURCE_DIR}/config/")
    if (EXISTS "${PROJECT_SOURCE_DIR}/config/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/config/")
    endif ()

    #拷贝依赖的xml文件
    foreach (MY_XML ${PROJECT_REQUIRED_ST_CONF})
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            "${PROJECT_SOURCE_DIR}/config/${MY_XML}.xml"
            "$<TARGET_FILE_DIR:${PROJECT_NAME}>/config/")
            message(STATUS "COPY MY_XML${MY_XML}")
    endforeach (MY_XML)


endif ()

message(STATUS "====================set_qt_compile.cmake end===================")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值