cmake_minimum_required(VERSION 3.16) project(AQTSampleMachinePlug VERSION 1.0.0 DESCRIPTION "Sample Machine Plugin for AQT" LANGUAGES CXX ) # 添加 Snap7 相关配置 set(SNAP7_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") set(SNAP7_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib") # 设置 Snap7 库文件路径 if(WIN32) set(SNAP7_LIB "${SNAP7_LIB_DIR}/snap7.lib") set(SNAP7_DLL "${SNAP7_LIB_DIR}/snap7.dll") else() set(SNAP7_LIB "${SNAP7_LIB_DIR}/libsnap7.so") endif() # 项目配置 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) # 查找依赖包 find_package(Qt6 REQUIRED COMPONENTS Core Quick) if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() if(NOT fastdds_FOUND) find_package(fastdds 3 REQUIRED) endif() # 源文件分组 set(SNAP7_SOURCES "${SNAP7_INCLUDE_DIR}/snap7.h" "${SNAP7_INCLUDE_DIR}/snap7.cpp" ) # 源文件分组 set(PLUGIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/AQTSampleMachinePlug.cxx" ) set(PLUGIN_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/AQTSampleMachinePlug.hpp" ) set(DDS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/DDSSampleMachine.IDL" ) # 查找生成的 DDS 文件 file(GLOB DDS_GENERATED_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/DDSSampleMachine*.cxx" "${CMAKE_CURRENT_SOURCE_DIR}/DDSSampleMachine*.cpp" ) file(GLOB DDS_GENERATED_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/DDSSampleMachine*.h" "${CMAKE_CURRENT_SOURCE_DIR}/DDSSampleMachine*.hpp" ) # 合并所有源文件 set(ALL_SOURCES ${SNAP7_SOURCES} ${PLUGIN_SOURCES} ${PLUGIN_HEADERS} ${DDS_FILES} ${DDS_GENERATED_SOURCES} ${DDS_GENERATED_HEADERS} ) # 创建源文件组 source_group("snap7 Files" FILES ${SNAP7_SOURCES}) source_group("Plugin Files" FILES ${PLUGIN_SOURCES} ${PLUGIN_HEADERS}) source_group("DDS Files" FILES ${DDS_FILES}) source_group("DDS Generated" FILES ${DDS_GENERATED_SOURCES} ${DDS_GENERATED_HEADERS}) # 设置输出文件名和后缀 if(WIN32) set(CMAKE_SHARED_LIBRARY_SUFFIX ".dll") else() set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") endif() # 创建插件库 add_library(${PROJECT_NAME} SHARED ${ALL_SOURCES} ${QML_FILES} AQTSampleMachinePlug.json ) # 调试配置 - 移动到创建目标之后 if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4 /Zi # 调试信息 /Od # 禁用优化 ) else() target_compile_options(${PROJECT_NAME} PRIVATE -g -Wall -Wextra -O0 ) endif() # 添加调试信息 message(STATUS "Debug build - adding debug symbols") message(STATUS "Compiler flags: ${CMAKE_CXX_FLAGS_DEBUG}") endif() # 添加包含目录 target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${SNAP7_INCLUDE_DIR} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) # 设置目标属性 set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" PREFIX "" SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}" # 使用平台相关的后缀 POSITION_INDEPENDENT_CODE ON VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} # RPATH 设置 SKIP_BUILD_RPATH FALSE BUILD_WITH_INSTALL_RPATH FALSE INSTALL_RPATH "$ORIGIN:${CMAKE_INSTALL_PREFIX}/lib" INSTALL_RPATH_USE_LINK_PATH TRUE ) # 安装配置 install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION bin RUNTIME DESTINATION bin ) # Windows 特定配置 if(WIN32) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # 添加 Snap7 相关的编译定义 target_compile_definitions(${PROJECT_NAME} PRIVATE AQTSAMPLEMACHINEPLUG_LIBRARY QT_PLUGIN SNAP7_EXPORTS # 添加这个 $<$<CONFIG:Debug>:QT_QML_DEBUG> ) endif() # 最终构建信息 message(STATUS "----------------------------------------") message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") message(STATUS "Binary Dir: ${CMAKE_BINARY_DIR}") message(STATUS "Plugin Output Dir: ${CMAKE_BINARY_DIR}/bin") message(STATUS "Plugin name will be: ${PROJECT_NAME}.so") message(STATUS "----------------------------------------") # 添加资源文件 qt_add_resources(${PROJECT_NAME} "resources" PREFIX "/AQTSampleMachinePlug" FILES ConfigWindow.qml ) # 链接库时确保 snap7 在最后 target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Quick fastdds fastcdr ${SNAP7_LIB} # 保持在最后 )