CMakeLists.txt 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. cmake_minimum_required(VERSION 3.12)
  2. project(ContainerDPC VERSION 1.0.0 LANGUAGES CXX)
  3. # 设置 C++ 标准
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_CXX_EXTENSIONS OFF)
  7. # 添加编译选项: -g 生成调试信息, -fPIC 位置无关代码
  8. add_compile_options(-g -fPIC)
  9. # 添加地址 sanitizer 选项(用于检测内存错误)
  10. # 仅在 Debug 模式下启用,避免影响 Release 性能
  11. set(SANITIZE_OPTIONS -fsanitize=address)
  12. add_compile_options($<$<CONFIG:Debug>:${SANITIZE_OPTIONS}>)
  13. link_libraries($<$<CONFIG:Debug>:${SANITIZE_OPTIONS}>)
  14. # 配置输出目录
  15. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  16. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  17. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  18. # 设置交付目录
  19. get_filename_component(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" ABSOLUTE)
  20. message(STATUS "交付目录: ${DELIVER_DIR}")
  21. # 定义交付库目录
  22. set(DELIVER_LIB_DIR "${DELIVER_DIR}/lib")
  23. message(STATUS "交付库目录: ${DELIVER_LIB_DIR}")
  24. # 确保交付库目录存在
  25. if(NOT EXISTS ${DELIVER_LIB_DIR})
  26. message(FATAL_ERROR "交付库目录不存在: ${DELIVER_LIB_DIR}")
  27. endif()
  28. # 添加链接目录
  29. link_directories(${DELIVER_LIB_DIR})
  30. message(STATUS "添加链接目录: ${DELIVER_LIB_DIR}")
  31. # 设置包含目录(包括交付头文件目录)
  32. set(DELIVER_INCLUDE_DIR "${DELIVER_DIR}/include")
  33. include_directories(
  34. ${DELIVER_INCLUDE_DIR}
  35. )
  36. # 配置源文件
  37. set(SRC_FILES
  38. ContainerDevice.h
  39. ContainerDevice.cpp
  40. ImagePool.h
  41. ImagePool.cpp
  42. ModelIF.h
  43. ContainerDPC.h
  44. ContainerDPC.cpp
  45. ModuleClient.h
  46. ModuleClient.cpp
  47. ModuleConfig.h
  48. ModuleConfig.cpp
  49. ModuleDevice.h
  50. ModuleDevice.cpp
  51. ModuleDriver.h
  52. ModuleDriver.cpp
  53. VirtualDevice.h
  54. VirtualDevice.cpp
  55. ${DELIVER_INCLUDE_DIR}/CCOS.Dev.IODevice.hpp
  56. ${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
  57. ${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
  58. ${DELIVER_INCLUDE_DIR}/common_api.h
  59. ${DELIVER_INCLUDE_DIR}/Base64.cpp
  60. )
  61. # 创建库目标
  62. add_library(ContainerDPC SHARED ${SRC_FILES})
  63. # 设置目标属性
  64. set_target_properties(ContainerDPC PROPERTIES
  65. VERSION ${PROJECT_VERSION}
  66. SOVERSION 1
  67. OUTPUT_NAME "ContainerDPC"
  68. )
  69. # 链接依赖库
  70. if(UNIX AND NOT APPLE)
  71. target_link_libraries(ContainerDPC PRIVATE common_api LogicDevice devClientlib)
  72. message(STATUS "已链接: LogicDevice")
  73. endif()
  74. # 确保交付目录结构存在
  75. file(MAKE_DIRECTORY
  76. "${DELIVER_DIR}/lib"
  77. "${DELIVER_DIR}/bin"
  78. "${DELIVER_DIR}/include"
  79. )
  80. add_custom_command(TARGET ContainerDPC POST_BUILD
  81. COMMENT "===== 复制构建产物到交付目录 ====="
  82. # 复制动态库/导入库
  83. COMMAND ${CMAKE_COMMAND} -E echo "复制库文件..."
  84. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/lib"
  85. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/bin"
  86. # 复制主库文件 (libDPC.so.1.0.0)
  87. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  88. "$<TARGET_FILE:ContainerDPC>"
  89. "${DELIVER_DIR}/lib"
  90. # 复制符号链接 (libDPC.so 和 libDPC.so.1)
  91. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  92. "$<TARGET_LINKER_FILE:ContainerDPC>"
  93. "${DELIVER_DIR}/lib"
  94. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  95. "$<TARGET_SONAME_FILE:ContainerDPC>"
  96. "${DELIVER_DIR}/lib"
  97. # 复制头文件
  98. COMMAND ${CMAKE_COMMAND} -E echo "复制头文件..."
  99. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/include"
  100. )
  101. set(HEADER_NAMES ContainerDPC ModuleDriver ModuleDriver VirtualDevice)
  102. # 一次性复制所有头文件
  103. foreach(header_name IN LISTS HEADER_NAMES)
  104. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.h")
  105. list(APPEND HEADERS_TO_COPY "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.h")
  106. elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.hpp")
  107. list(APPEND HEADERS_TO_COPY "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.hpp")
  108. else()
  109. message(WARNING "未找到头文件: ${header_name}.h 或 ${header_name}.hpp")
  110. endif()
  111. endforeach()
  112. # 添加单个复制命令复制所有头文件
  113. if(HEADERS_TO_COPY)
  114. add_custom_command(TARGET ContainerDPC POST_BUILD
  115. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  116. ${HEADERS_TO_COPY}
  117. "${DELIVER_DIR}/include"
  118. COMMENT "复制头文件到交付目录"
  119. )
  120. endif()