cmake_minimum_required(VERSION 3.19) project(soft_bus LANGUAGES CXX) # 设置C++标准 set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) # 查找Qt6 find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets SerialPort Charts Sql) # 检测编译平台 if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") set(PlatformDir "x86") else() set(PlatformDir "x64") endif() # 设置ADS路径 SET(ADS_DIR "${PROJECT_SOURCE_DIR}/advanced_dock_system") # 关键修改:添加ADS子目录 add_subdirectory(${ADS_DIR}/src) # 添加Qt项目设置 qt_standard_project_setup() # 添加可执行文件 qt_add_executable(soft_bus WIN32 MACOSX_BUNDLE main.cpp src/soft_bus_core/soft_bus_core.cpp src/soft_bus_core/soft_bus_core.h src/serial_manager/serial_manager.h src/serial_manager/serial_manager.cpp src/serial_manager/serial_data_buffer.h src/serial_manager/serial_data_buffer.cpp src/serial_manager/serial_storage_thread.h src/serial_manager/serial_storage_thread.cpp src/serial_manager/serial_parser_thread.h src/serial_manager/serial_parser_thread.cpp src/devices/DeviceWatcherBase.h src/devices/DeviceWatcherBase.cpp src/devices/DeviceManager.h src/devices/DeviceManager.cpp src/devices/serial/SerialPortInfo.h src/devices/serial/SerialPortWatcher.h src/devices/serial/SerialPortWatcher.cpp src/devices/usb/UsbDeviceInfo.h src/devices/usb/UsbDeviceWatcher.h src/devices/usb/UsbDeviceWatcher.cpp src/devices/network/NetworkDeviceInfo.h src/devices/network/NetworkPortWatcher.h src/devices/network/NetworkPortWatcher.cpp src/devices/platform/linux/UdevMonitor.h src/devices/platform/linux/UdevMonitor.cpp src/devices/platform/linux/LinuxDeviceUtils.h src/devices/platform/windows/WinDeviceMonitor.h src/devices/platform/windows/WinDeviceMonitor.cpp src/devices/platform/windows/WinDeviceUtils.h src/can_manager/can_manager.h src/can_manager/can_manager.cpp mainwindow.h mainwindow.cpp src/toolbar/toolbar.h src/toolbar/toolbar.cpp resource.qrc src/view_core/viewcore.h src/view_core/viewcore.cpp src/view_core/viewcore.ui src/view_serial/serialmodule.h src/view_serial/serialmodule.cpp src/view_serial/serialdockpage.h src/view_serial/serialdockpage.cpp src/view_serial/serial_settings_widget.h src/view_serial/serial_settings_widget.cpp src/view_serial/serial_settings_widget.ui src/view_can/viewcan.h src/view_can/viewcan.cpp src/view_can/viewcan.ui src/view_can/can_data_widget.h src/view_can/can_data_widget.cpp src/view_can/can_data_widget.ui src/device_config/device_tree_widget.h src/device_config/device_tree_widget.cpp src/device_config/device_tree_widget.ui src/libmodbus/modbus_config_widget.h src/libmodbus/modbus_config_widget.cpp src/libmodbus/modbus_config_widget.ui src/libmodbus/src/modbus.c src/libmodbus/src/modbus-data.c src/libmodbus/src/modbus-rtu.c src/libmodbus/src/modbus-tcp.c src/view_serial/serial_data_widget.h src/view_serial/serial_data_widget.cpp src/view_serial/serial_data_widget.ui src/message_viewer/raw_data_table_widget.h src/message_viewer/raw_data_table_widget.cpp src/message_viewer/raw_data_table_widget.ui src/message_viewer/bus_data_table_widget.h src/message_viewer/bus_data_table_widget.cpp src/message_viewer/bus_data_table_widget.ui src/message_viewer/message_viewer_widget.h src/message_viewer/message_viewer_widget.cpp src/my_dock_manager/mdockmanager.cpp src/my_dock_manager/mdockmanager.h src/database_manager/database_types.h src/database_manager/databaseconnectiondock.h src/database_manager/databaseconnectiondock.cpp src/database_manager/databasepage.h src/database_manager/databasepage.cpp src/database_manager/databasepage.ui src/database_manager/databasemodule.h src/database_manager/databasemodule.cpp src/database_manager/databasesearchdialog.h src/database_manager/databasesearchdialog.cpp src/database_manager/databasesearchdialog.ui ) # 关键修改:链接ADS库(使用目标名称) if(Qt6_VERSION_MAJOR EQUAL 6) target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt6) else() target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt5) endif() # 设置CAN API库路径 set(CAN_API_DIR "${PROJECT_SOURCE_DIR}/libs/can_api") # 转换为绝对路径以确保链接器能找到库 get_filename_component(CAN_API_LIB "${CAN_API_DIR}/lib/lib_emuc2_64.a" ABSOLUTE) # 验证库文件是否存在 if(NOT EXISTS "${CAN_API_LIB}") message(FATAL_ERROR "CAN API library not found: ${CAN_API_LIB}") endif() # 创建导入的静态库目标 add_library(emuc2_static STATIC IMPORTED) set_target_properties(emuc2_static PROPERTIES IMPORTED_LOCATION "${CAN_API_LIB}" ) # 链接其他库 # 注意:静态库的链接顺序很重要 # CAN API库将在Linux部分通过target_link_options使用--whole-archive方式链接 target_link_libraries(soft_bus PRIVATE Qt6::Core Qt6::Widgets Qt6::SerialPort Qt6::Charts Qt6::Sql pthread ) if(WIN32) target_link_libraries(soft_bus PRIVATE shlwapi rpcrt4 ws2_32 # Winsock 库 advapi32 # 高级服务库 user32 # 用户界面库 gdi32 # 图形设备接口 ole32 # OLE 库 oleaut32 # OLE 自动化 uuid # UUID 支持 "${CAN_API_LIB}" # Windows下直接链接 ) else() # 查找 zlib 库 find_package(ZLIB REQUIRED) # 在链接库时加入 zlib 库 if(ZLIB_FOUND) target_link_libraries(soft_bus PRIVATE ${ZLIB_LIBRARIES}) endif() # 查找并链接 libudev 用于设备热插拔监控 find_library(UDEV_LIB udev REQUIRED) if(UDEV_LIB) target_link_libraries(soft_bus PRIVATE ${UDEV_LIB}) endif() # 添加CAN API库目录到链接路径(Linux) target_link_directories(soft_bus PRIVATE "${CAN_API_DIR}/lib") # 链接CAN API静态库,使用 --whole-archive 确保所有符号都被链接 # 直接在 target_link_libraries 中混合使用选项和库文件,CMake 会保持顺序 target_link_libraries(soft_bus PRIVATE "-Wl,--whole-archive" "${CAN_API_LIB}" "-Wl,--no-whole-archive" ) endif() # 添加包含路径 target_include_directories(soft_bus PRIVATE ${PROJECT_SOURCE_DIR}/src ${ADS_DIR}/src # ADS头文件路径 ${PROJECT_SOURCE_DIR}/src/libmodbus/src # libmodbus库头文件路径 ${CAN_API_DIR}/include # CAN API头文件路径 ) # 安装配置 include(GNUInstallDirs) install(TARGETS soft_bus BUNDLE DESTINATION . RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) qt_generate_deploy_app_script( TARGET soft_bus OUTPUT_SCRIPT deploy_script NO_UNSUPPORTED_PLATFORM_ERROR ) install(SCRIPT ${deploy_script})