CMakeLists.txt 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. LogLocalHelper.cpp
  56. LogLocalHelper.h
  57. ${DELIVER_INCLUDE_DIR}/CCOS.Dev.IODevice.hpp
  58. ${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
  59. ${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
  60. ${DELIVER_INCLUDE_DIR}/common_api.h
  61. ${DELIVER_INCLUDE_DIR}/Base64.cpp
  62. )
  63. # 创建库目标
  64. add_library(ContainerDPC SHARED ${SRC_FILES})
  65. # 设置目标属性
  66. set_target_properties(ContainerDPC PROPERTIES
  67. VERSION ${PROJECT_VERSION}
  68. SOVERSION 1
  69. OUTPUT_NAME "ContainerDPC"
  70. )
  71. # 链接依赖库
  72. if(UNIX AND NOT APPLE)
  73. target_link_libraries(ContainerDPC PRIVATE common_api LogicDevice devClientlib)
  74. message(STATUS "已链接: LogicDevice")
  75. endif()
  76. # 确保交付目录结构存在
  77. file(MAKE_DIRECTORY
  78. "${DELIVER_DIR}/lib"
  79. "${DELIVER_DIR}/bin"
  80. "${DELIVER_DIR}/include"
  81. )
  82. add_custom_command(TARGET ContainerDPC POST_BUILD
  83. COMMENT "===== 复制构建产物到交付目录 ====="
  84. # 1. 准备交付目录(确保目录存在,避免操作失败)
  85. COMMAND ${CMAKE_COMMAND} -E echo "准备交付目录(lib/bin/include)..."
  86. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/lib"
  87. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/bin"
  88. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/include"
  89. # 2. 复制核心库文件(唯一真实二进制文件,如 libContainerDPC.so.1.0.0)
  90. COMMAND ${CMAKE_COMMAND} -E echo "复制核心库文件(ContainerDPC完整版本)..."
  91. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  92. "$<TARGET_FILE:ContainerDPC>" # 源:完整版本核心库(含全版本号)
  93. "${DELIVER_DIR}/lib" # 目标:交付目录的lib文件夹
  94. # 3. 创建主版本符号链接(如 libContainerDPC.so.1 -> libContainerDPC.so.1.0.0)
  95. # 作用:保障主版本兼容性(升级同主版本号的库时,依赖程序无需重新编译)
  96. COMMAND ${CMAKE_COMMAND} -E echo "创建主版本符号链接(.so.1 -> 完整版本)..."
  97. COMMAND ${CMAKE_COMMAND} -E create_symlink
  98. "$<TARGET_FILE_NAME:ContainerDPC>" # 链接指向的目标(核心库文件名)
  99. "${DELIVER_DIR}/lib/$<TARGET_SONAME_FILE_NAME:ContainerDPC>" # 链接文件本身(主版本名)
  100. # 4. 创建通用符号链接(如 libContainerDPC.so -> libContainerDPC.so.1)
  101. # 作用:简化编译链接,其他项目可通过 -lContainerDPC 直接引用
  102. COMMAND ${CMAKE_COMMAND} -E echo "创建通用符号链接(.so -> 主版本)..."
  103. COMMAND ${CMAKE_COMMAND} -E create_symlink
  104. "$<TARGET_SONAME_FILE_NAME:ContainerDPC>" # 链接指向的目标(主版本链接名)
  105. "${DELIVER_DIR}/lib/$<TARGET_LINKER_FILE_NAME:ContainerDPC>" # 链接文件本身(通用名)
  106. # 复制头文件
  107. COMMAND ${CMAKE_COMMAND} -E echo "复制头文件..."
  108. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/include"
  109. )
  110. set(HEADER_NAMES ContainerDPC ModuleDriver ModuleDriver VirtualDevice)
  111. # 一次性复制所有头文件
  112. foreach(header_name IN LISTS HEADER_NAMES)
  113. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.h")
  114. list(APPEND HEADERS_TO_COPY "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.h")
  115. elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.hpp")
  116. list(APPEND HEADERS_TO_COPY "${CMAKE_CURRENT_SOURCE_DIR}/${header_name}.hpp")
  117. else()
  118. message(WARNING "未找到头文件: ${header_name}.h 或 ${header_name}.hpp")
  119. endif()
  120. endforeach()
  121. # 添加单个复制命令复制所有头文件
  122. if(HEADERS_TO_COPY)
  123. add_custom_command(TARGET ContainerDPC POST_BUILD
  124. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  125. ${HEADERS_TO_COPY}
  126. "${DELIVER_DIR}/include"
  127. COMMENT "复制头文件到交付目录"
  128. )
  129. endif()