CMakeLists.txt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. cmake_minimum_required(VERSION 3.12)
  2. project(CommonPacket VERSION 1.0.0 LANGUAGES CXX)
  3. # === 基础配置 ===
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_CXX_EXTENSIONS OFF)
  7. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  8. # 添加编译选项: -g 生成调试信息, -fPIC 位置无关代码
  9. add_compile_options(-g -fPIC)
  10. # 添加地址 sanitizer 选项(用于检测内存错误)
  11. # 仅在 Debug 模式下启用,避免影响 Release 性能
  12. set(SANITIZE_OPTIONS -fsanitize=address)
  13. add_compile_options($<$<CONFIG:Debug>:${SANITIZE_OPTIONS}>)
  14. link_libraries($<$<CONFIG:Debug>:${SANITIZE_OPTIONS}>)
  15. # === 输出目录配置 ===
  16. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  17. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  18. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  19. # === 路径配置 ===
  20. set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  21. set(INCLUDE_DIR ${SRC_DIR})
  22. # 核心交付目录【复用,无需修改】
  23. set(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" CACHE PATH "交付目录路径")
  24. get_filename_component(DELIVER_DIR ${DELIVER_DIR} ABSOLUTE)
  25. message(STATUS "交付目录: ${DELIVER_DIR}")
  26. set(CCOSLOCK_INCLUDE_DIR "${DELIVER_DIR}/include")
  27. set(CCOSLOCK_LIB_DIR "${DELIVER_DIR}/lib")
  28. get_filename_component(CCOSLOCK_INCLUDE_DIR ${CCOSLOCK_INCLUDE_DIR} ABSOLUTE)
  29. get_filename_component(CCOSLOCK_LIB_DIR ${CCOSLOCK_LIB_DIR} ABSOLUTE)
  30. message(STATUS "CcosLock 头文件目录: ${CCOSLOCK_INCLUDE_DIR}")
  31. message(STATUS "CcosLock 库文件目录: ${CCOSLOCK_LIB_DIR}")
  32. set(CRC64_INCLUDE_DIR "${DELIVER_DIR}/include")
  33. set(CRC64_LIB_DIR "${DELIVER_DIR}/lib")
  34. get_filename_component(CRC64_INCLUDE_DIR ${CRC64_INCLUDE_DIR} ABSOLUTE)
  35. get_filename_component(CRC64_LIB_DIR ${CRC64_LIB_DIR} ABSOLUTE)
  36. message(STATUS "Crc64 头文件目录: ${CRC64_INCLUDE_DIR}")
  37. message(STATUS "Crc64 库文件目录: ${CRC64_LIB_DIR}")
  38. # === 源文件与头文件 ===
  39. set(SRC_FILES
  40. ${SRC_DIR}/PacketAnalizer.cpp
  41. )
  42. set(HEADER_FILES
  43. ${INCLUDE_DIR}/PacketAnalizer.h
  44. )
  45. # 验证当前工程头文件是否存在
  46. foreach(header ${HEADER_FILES})
  47. if(NOT EXISTS ${header})
  48. message(FATAL_ERROR "头文件不存在: ${header}")
  49. endif()
  50. endforeach()
  51. if(NOT EXISTS "${CCOSLOCK_INCLUDE_DIR}/CcosLock.h")
  52. message(FATAL_ERROR "CcosLock.h 不存在于 ${CCOSLOCK_INCLUDE_DIR}")
  53. endif()
  54. if(NOT EXISTS "${CRC64_INCLUDE_DIR}/Crc64.h")
  55. message(FATAL_ERROR "Crc64.h 不存在于 ${CRC64_INCLUDE_DIR}")
  56. endif()
  57. find_library(CCOSLOCK_LIB
  58. NAMES CcosLock libCcosLock # 同时检查带/不带lib前缀的库名
  59. PATHS ${CCOSLOCK_LIB_DIR}
  60. NO_DEFAULT_PATH # 只在指定目录查找,不搜索系统默认路径
  61. )
  62. if(NOT CCOSLOCK_LIB)
  63. message(FATAL_ERROR "找不到CcosLock库,路径: ${CCOSLOCK_LIB_DIR}")
  64. else()
  65. message(STATUS "找到CcosLock库: ${CCOSLOCK_LIB}")
  66. endif()
  67. find_library(CRC64_LIB
  68. NAMES Crc64 libCrc64 # 同时检查带/不带lib前缀的库名
  69. PATHS ${CRC64_LIB_DIR}
  70. NO_DEFAULT_PATH # 只在指定目录查找,不搜索系统默认路径
  71. )
  72. if(NOT CRC64_LIB)
  73. message(FATAL_ERROR "找不到Crc64库,路径: ${CRC64_LIB_DIR}")
  74. else()
  75. message(STATUS "找到Crc64库: ${CRC64_LIB}")
  76. endif()
  77. # === 构建共享库 ===
  78. add_library(CommonPacket SHARED ${SRC_FILES} ${HEADER_FILES})
  79. # === 目标属性配置 ===
  80. set_target_properties(CommonPacket PROPERTIES
  81. VERSION ${PROJECT_VERSION}
  82. SOVERSION 1
  83. OUTPUT_NAME "CommonPacket"
  84. PUBLIC_HEADER "${HEADER_FILES}"
  85. )
  86. # === 编译选项 ===
  87. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  88. target_compile_options(CommonPacket PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type)
  89. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  90. target_compile_options(CommonPacket PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type)
  91. endif()
  92. # === 依赖配置 - 头文件目录 ===
  93. target_include_directories(CommonPacket
  94. PUBLIC
  95. $<BUILD_INTERFACE:${INCLUDE_DIR}>
  96. $<BUILD_INTERFACE:${CCOSLOCK_INCLUDE_DIR}>
  97. $<BUILD_INTERFACE:${CRC64_INCLUDE_DIR}> # 【新增】添加CRC64头文件目录
  98. $<INSTALL_INTERFACE:include>
  99. )
  100. # === 依赖配置 - 链接库【核心修改】===
  101. # 同时链接:CcosLock + Crc64 + pthread + dl,所有依赖一次性配置完成
  102. target_link_libraries(CommonPacket
  103. PUBLIC
  104. ${CCOSLOCK_LIB} # 原有:CcosLock库
  105. ${CRC64_LIB} # 新增:Crc64/libCrc库
  106. PRIVATE
  107. pthread
  108. dl
  109. )
  110. # === 交付与安装 ===
  111. file(MAKE_DIRECTORY
  112. ${DELIVER_DIR}/lib
  113. ${DELIVER_DIR}/include
  114. )
  115. add_custom_command(TARGET CommonPacket POST_BUILD
  116. COMMENT "复制构建产物到交付目录: ${DELIVER_DIR}"
  117. # 1. 确保交付目录存在(避免链接/复制失败)
  118. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/lib"
  119. COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/include"
  120. # 2. 复制核心库文件(唯一真实二进制文件,如 libCommonPacket.so.1.0.0)
  121. COMMAND ${CMAKE_COMMAND} -E echo "复制CommonPacket核心库文件..."
  122. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  123. "$<TARGET_FILE:CommonPacket>" # 源:完整版本核心库(含全版本号)
  124. "${DELIVER_DIR}/lib/" # 目标:交付目录的lib文件夹
  125. # 3. 创建主版本符号链接(如 libCommonPacket.so.1 -> libCommonPacket.so.1.0.0)
  126. COMMAND ${CMAKE_COMMAND} -E echo "创建CommonPacket主版本符号链接..."
  127. COMMAND ${CMAKE_COMMAND} -E create_symlink
  128. "$<TARGET_FILE_NAME:CommonPacket>" # 链接指向的目标(核心库文件名)
  129. "${DELIVER_DIR}/lib/$<TARGET_SONAME_FILE_NAME:CommonPacket>" # 链接文件本身(主版本名)
  130. # 4. 创建通用符号链接(如 libCommonPacket.so -> libCommonPacket.so.1)
  131. COMMAND ${CMAKE_COMMAND} -E echo "创建CommonPacket通用符号链接..."
  132. COMMAND ${CMAKE_COMMAND} -E create_symlink
  133. "$<TARGET_SONAME_FILE_NAME:CommonPacket>" # 链接指向的目标(主版本链接名)
  134. "${DELIVER_DIR}/lib/$<TARGET_LINKER_FILE_NAME:CommonPacket>" # 链接文件本身(通用名)
  135. # 5. 复制头文件(保持原逻辑,确保头文件正确交付)
  136. COMMAND ${CMAKE_COMMAND} -E echo "复制CommonPacket头文件..."
  137. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  138. ${HEADER_FILES}
  139. ${DELIVER_DIR}/include/
  140. )
  141. # 安装配置
  142. install(TARGETS CommonPacket
  143. EXPORT CommonPacketTargets
  144. LIBRARY DESTINATION lib
  145. ARCHIVE DESTINATION lib
  146. PUBLIC_HEADER DESTINATION include
  147. )
  148. install(EXPORT CommonPacketTargets
  149. FILE CommonPacketConfig.cmake
  150. DESTINATION lib/cmake/CommonPacket
  151. EXPORT_LINK_INTERFACE_LIBRARIES
  152. )
  153. # === 调试辅助 - 【新增CRC64日志】===
  154. message(STATUS "CommonPacket 源文件: ${SRC_FILES}")
  155. message(STATUS "CommonPacket 头文件: ${HEADER_FILES}")
  156. message(STATUS "CommonPacket 链接库: ${CCOSLOCK_LIB} ${CRC64_LIB} pthread dl")