项目结构

项目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
)