cmake多exe生成设计

项目结构

在这里插入图片描述

项目Cmake

project(DemoApp)
cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11)

message(STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")

#设置环境相关
message(STATUS "====================set env===================")
set(PROJECT_OUTPUT_DIR ${PROJECT_SOURCE_DIR}/bin)
message(STATUS "PROJECT_OUTPUT_DIR is ${PROJECT_OUTPUT_DIR}")

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}")

#同时生成lib与DLL
message(STATUS "PROJECT_BINARY_DIR is ${PROJECT_BINARY_DIR}")
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}) #DLL生成路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) #lib生成路径
set(CMAKE_PDB_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) #pdb生成路径

# 处理编译字符集问题
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")

#设置QT相关配置
message(STATUS "====================set QT===================")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

#定义QT路径,如果环境变量QT_PATH存在,则使用环境变量,否则使用默认路径
if (DEFINED ENV{QTDIR})
    set(CMAKE_PREFIX_PATH $ENV{QTDIR}/msvc2017_64/lib/cmake)
else ()
    set(CMAKE_PREFIX_PATH D:/Library/Qt5.14.2/5.14.2/msvc2017_64/lib/cmake) # 配置QT路径
endif ()
message(STATUS "CMAKE_PREFIX_PATH is ${CMAKE_PREFIX_PATH}")

find_package(Qt5 COMPONENTS # 查找QT的模块
        Core
        Gui
        Widgets
        SerialPort
        WebSockets
        Network
        REQUIRED)
set(PROJECT_REQUIRED_QT5_DLL Core Gui Widgets SerialPort WebSockets Network)
message(STATUS "Qt5Gui_PRIVATE_INCLUDE_DIRS is ${Qt5Gui_PRIVATE_INCLUDE_DIRS}")

#设置项目依赖相关配置
message(STATUS "====================set project depedency===================")
#定义头文件需要寻址的路径
include_directories(
        ${PROJECT_LIBRARY_INCLUDE_DIR} #头文件
        ${Qt5Gui_PRIVATE_INCLUDE_DIRS} #QTGUI库默认头文件路径
        DemoApp/include #模块头文件
        DemoApp1/include #模块头文件
)
#定义库文件需要寻址的路径
link_directories(
        ${PROJECT_LIBRARY_LIB_DIR}
)

#设置子目录相关配置
message(STATUS "====================set subdirectory===================")
add_subdirectory(DemoApp)
add_subdirectory(DemoApp1)


DemoApp

#定义头文件路径
include_directories(./include)

#把目录src和inc下面的所有文件作为变量存储
file(GLOB_RECURSE SRC_FILES "src/*")
file(GLOB_RECURSE INC_FILES "include/*")

#静态资源设置文件
set(QRC_FILES ./assets.qrc)

add_executable(DemoApp ${SRC_FILES} ${INC_FILES} ${QRC_FILES})
target_link_libraries(DemoApp
        Qt5::Core
        Qt5::Gui
        Qt5::Widgets
        Qt5::WebSockets
        Qt5::Network
)


#设置依赖的QT DLL及外部DLL拷贝名、配置文件
file(GLOB_RECURSE MY_COMPONENTS "${PROJECT_LIBRARY_DLL_DIR}/*")
file(GLOB_RECURSE MY_CONFIGS "${PROJECT_SOURCE_DIR}/config/*")

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" "${PROJECT_OUTPUT_DIR}")
        message(STATUS "COPY QT_LIB ${QT_LIB}")
    endforeach (QT_LIB)
    
    #拷贝依赖的DLL和exe
    foreach (MY_COMPONENT ${MY_COMPONENTS})
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${MY_COMPONENT}" "${PROJECT_OUTPUT_DIR}")
        message(STATUS "COPY MY_COMPONENT ${MY_COMPONENT}")
    endforeach (MY_COMPONENT)

    #如果本地存在配置文件夹,则在输出目录先建目录,再拷贝config文件
    if (EXISTS "${PROJECT_SOURCE_DIR}/config/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_OUTPUT_DIR}/config/")
        message(STATUS "CREATE config path is ${PROJECT_SOURCE_DIR}/config/")

        #拷贝依赖的xml文件
        foreach (MY_CONFIG ${MY_CONFIGS})
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${MY_CONFIG}" "${PROJECT_OUTPUT_DIR}/config/")
            message(STATUS "COPY MY_CONFIG ${MY_CONFIG}")
        endforeach (MY_CONFIG)
    endif ()
endif ()

DemoApp1

#定义头文件路径
include_directories(./include)

#把目录src和inc下面的所有文件作为变量存储
file(GLOB_RECURSE SRC_FILES "src/*")
file(GLOB_RECURSE INC_FILES "include/*")

add_executable(DemoApp1 ${SRC_FILES} ${INC_FILES})
target_link_libraries(DemoApp1
        Qt5::Core
        Qt5::Gui
        Qt5::Widgets
        Qt5::WebSockets
        Qt5::Network
)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值