From cb46f761371bef169ab6ce4760123894a3ae27ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E9=9B=A8?= Date: Fri, 27 Feb 2026 16:15:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=BA=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E5=BA=93=E6=9E=B6=E6=9E=84=EF=BC=8C=E6=94=AF=E6=8C=81=E7=8E=B0?= =?UTF-8?q?=E4=BB=A3=20CMake=20=E5=AE=89=E8=A3=85=E4=B8=8E=E9=9B=86?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=BF=BD=E7=95=A5=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- CMakeLists.txt | 179 ++++++++++++++++++++++++---------- cmake/QFancyUIConfig.cmake.in | 18 ++++ src/Fancy/MSWidget.h | 2 +- 4 files changed, 150 insertions(+), 52 deletions(-) create mode 100644 cmake/QFancyUIConfig.cmake.in diff --git a/.gitignore b/.gitignore index 2925b47..96f1605 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ OpenCV/ out/ *.py *.pyc -*.exe \ No newline at end of file +*.exe +cmake-build-debug-mingw \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 6147d6d..93589b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,13 +17,73 @@ endif () find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Xml Svg SvgWidgets REQUIRED) +# 定义库的导出宏 +set(LIBRARY_NAME "QFancyUI") +if (WIN32) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif() + +# 定义安装路径 +set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation prefix") + +# ============================================ +# 1. 创建动态库 +# ============================================ + +# 收集库的源文件(不包括示例) file(GLOB_RECURSE FANCYUI_SOURCES - "${PROJECT_SOURCE_DIR}/src/Fancy/*.h" - "${PROJECT_SOURCE_DIR}/src/Fancy/*.cpp" - "${PROJECT_SOURCE_DIR}/src/resource/*.qrc" + "${PROJECT_SOURCE_DIR}/src/Fancy/*.h" + "${PROJECT_SOURCE_DIR}/src/Fancy/*.cpp" + "${PROJECT_SOURCE_DIR}/src/resource/*.qrc" +) + +# 创建动态库 +qt_add_library(${LIBRARY_NAME} SHARED + ${FANCYUI_SOURCES} +) + +# 设置库版本 +set_target_properties(${LIBRARY_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION 3 + OUTPUT_NAME "QFancyUI" + DEBUG_POSTFIX "d" +) + +# 库的头文件包含路径 +target_include_directories(${LIBRARY_NAME} PUBLIC + $ + $ + $ ) -file(GLOB_RECURSE EXAMPLE_SOURCES +# 链接 Qt 库 +target_link_libraries(${LIBRARY_NAME} PUBLIC + Qt6::Core + Qt6::Gui + Qt6::Widgets + Qt6::Xml + Qt6::Svg + Qt6::SvgWidgets +) + +# Windows 特定链接 +if (WIN32) + target_link_libraries(${LIBRARY_NAME} PRIVATE + user32.lib + dwmapi.lib + advapi32.lib + ) +endif() + +# ============================================ +# 2. 创建示例程序(可选) +# ============================================ +option(BUILD_EXAMPLES "Build example programs" ON) + +if (BUILD_EXAMPLES) + # 收集示例源文件 + file(GLOB_RECURSE EXAMPLE_SOURCES "${PROJECT_SOURCE_DIR}/Example/*.h" "${PROJECT_SOURCE_DIR}/Example/*.cpp" "${PROJECT_SOURCE_DIR}/Example/*.ui" @@ -31,63 +91,82 @@ file(GLOB_RECURSE EXAMPLE_SOURCES "${PROJECT_SOURCE_DIR}/Example/Example_Additional_Code/*.cpp" "${PROJECT_SOURCE_DIR}/Example/Example_Resource/*.qrc" "${PROJECT_SOURCE_DIR}/Example/Main_Program_Page_Code/*.h" - "${PROJECT_SOURCE_DIR}/Example/Main_Program_Page_Code*.cpp" + "${PROJECT_SOURCE_DIR}/Example/Main_Program_Page_Code/*.cpp" "${PROJECT_SOURCE_DIR}/Example/Main_Program_Page_Code/*.ui" -) + ) -add_executable(${PROJECT_NAME} - ${FANCYUI_SOURCES} + # 创建示例程序 + add_executable(${PROJECT_NAME}_Example ${EXAMPLE_SOURCES} -) -target_link_libraries(${PROJECT_NAME} PRIVATE - Qt${QT_VERSION_MAJOR}::Core - Qt${QT_VERSION_MAJOR}::Gui - Qt${QT_VERSION_MAJOR}::Widgets - Qt${QT_VERSION_MAJOR}::Xml - Qt${QT_VERSION_MAJOR}::Svg - Qt${QT_VERSION_MAJOR}::SvgWidgets -) + ) -set(FANCY_SRC_INCLUDE_DIRS - ${PROJECT_SOURCE_DIR}/src/Fancy - ${PROJECT_SOURCE_DIR}/src/include/magic_enum -) + # 链接到我们创建的库 + target_link_libraries(${PROJECT_NAME}_Example PRIVATE + ${LIBRARY_NAME} + ) -set(EXAMPLE_INCLUDE_DIRS + # 示例程序的头文件路径 + target_include_directories(${PROJECT_NAME}_Example PRIVATE ${PROJECT_SOURCE_DIR}/Example ${PROJECT_SOURCE_DIR}/Example/Example_Additional_Code ${PROJECT_SOURCE_DIR}/Example/Main_Program_Page_Code + ) + + # 设置可执行文件输出目录 + set_target_properties(${PROJECT_NAME}_Example PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin + ) +endif() + +# ============================================ +# 3. 安装配置 +# ============================================ + +# 安装库文件 +install(TARGETS ${LIBRARY_NAME} + EXPORT ${LIBRARY_NAME}Targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin ) -include_directories(${FANCY_SRC_INCLUDE_DIRS}) -include_directories(${EXAMPLE_INCLUDE_DIRS}) +# 安装头文件 +install(DIRECTORY src/Fancy/ + DESTINATION include/${LIBRARY_NAME} + FILES_MATCHING PATTERN "*.h" + PATTERN "*.cpp" EXCLUDE +) -if (WIN32) - target_link_libraries(${PROJECT_NAME} PRIVATE - user32.lib - dwmapi.lib - advapi32.lib - ) -endif () +install(DIRECTORY src/include/ + DESTINATION include/${LIBRARY_NAME} + FILES_MATCHING PATTERN "*.h" +) -#message(STATUS "CMake version: ${CMAKE_VERSION}") # CMake版本 -#message(STATUS "CMake generator: ${CMAKE_GENERATOR}") # 使用的生成器 -#message(STATUS "Qt version: ${Qt6_VERSION}") # Qt版本 -#message(STATUS "Qt Core module version: ${Qt6Core_VERSION}") # QtCore模块版本 -#message(STATUS "Qt Core include dirs: ${Qt6Core_INCLUDE_DIRS}") # QtCore头文件路径 -#message(STATUS "Qt AutoMOC enabled: ${CMAKE_AUTOMOC}") # 元对象编译器状态 -#message(STATUS "Qt AutoRCC enabled: ${CMAKE_AUTORCC}") # 资源编译器状态 -#message(STATUS "Qt AutoUIC enabled: ${CMAKE_AUTOUIC}") # UIC编译器状态 -#message(STATUS "compiler: ${CMAKE_CXX_COMPILER}") # 编译器路径 -#message(STATUS "compiler ID: ${CMAKE_CXX_COMPILER_ID}") # 编译器厂商(MSVC/GNU/Clang等) -#message(STATUS "compiler version: ${CMAKE_CXX_COMPILER_VERSION}") # 编译器版本号 -#message(STATUS "compiler flags: ${CMAKE_CXX_FLAGS}") # 全局编译选项 -#message(STATUS "C++ standard: ${CMAKE_CXX_STANDARD}") # C++标准 -#message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") # 编译类型(Release/Debug等) -#message(STATUS "Project name: ${PROJECT_NAME}") # 项目名称 -#message(STATUS "Project version: ${PROJECT_VERSION}") # 项目版本号 -#message(STATUS "Source directory: ${CMAKE_SOURCE_DIR}") # 源代码根目录 -#message(STATUS "Build directory: ${CMAKE_BINARY_DIR}") # 构建目录 -#message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") # 安装时的基础路径 +# 安装 CMake 配置文件 +install(EXPORT ${LIBRARY_NAME}Targets + FILE ${LIBRARY_NAME}Targets.cmake + NAMESPACE ${LIBRARY_NAME}:: + DESTINATION lib/cmake/${LIBRARY_NAME} +) + +# 创建配置文件 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${LIBRARY_NAME}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}Config.cmake + @ONLY +) +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}Config.cmake + DESTINATION lib/cmake/${LIBRARY_NAME} +) +# ============================================ +# 4. 调试信息输出(可选) +# ============================================ +# if (CMAKE_BUILD_TYPE STREQUAL "Debug") +# message(STATUS "Building ${LIBRARY_NAME} as shared library") +# message(STATUS "Qt version: ${Qt6_VERSION}") +# message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") +# message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") +# endif() diff --git a/cmake/QFancyUIConfig.cmake.in b/cmake/QFancyUIConfig.cmake.in new file mode 100644 index 0000000..dd2a64f --- /dev/null +++ b/cmake/QFancyUIConfig.cmake.in @@ -0,0 +1,18 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) + +# 查找 Qt6 依赖 +find_dependency(Qt6 6.5 REQUIRED COMPONENTS Core Gui Widgets Xml Svg SvgWidgets) + +# 包含目标文件 +include("${CMAKE_CURRENT_LIST_DIR}/QFancyUITargets.cmake") + +# 添加版本检查 +set(QFANCYUI_VERSION_MAJOR @PROJECT_VERSION_MAJOR@) +set(QFANCYUI_VERSION_MINOR @PROJECT_VERSION_MINOR@) +set(QFANCYUI_VERSION_PATCH @PROJECT_VERSION_PATCH@) +set(QFANCYUI_VERSION @PROJECT_VERSION@) + +# 检查版本兼容性 +check_required_components(QFancyUI) diff --git a/src/Fancy/MSWidget.h b/src/Fancy/MSWidget.h index 3e8dbe6..217454c 100644 --- a/src/Fancy/MSWidget.h +++ b/src/Fancy/MSWidget.h @@ -16,7 +16,7 @@ namespace fancy Q_OBJECT public: - explicit MSWidget(QWidget *parent); + explicit MSWidget(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override;