cmake_minimum_required(VERSION 3.12) project(CommonPacket VERSION 1.0.0 LANGUAGES CXX) # === 基础配置 === set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON) # 添加编译选项: -g 生成调试信息, -fPIC 位置无关代码 add_compile_options(-g -fPIC) # 添加地址 sanitizer 选项(用于检测内存错误) # 仅在 Debug 模式下启用,避免影响 Release 性能 set(SANITIZE_OPTIONS -fsanitize=address) add_compile_options($<$:${SANITIZE_OPTIONS}>) link_libraries($<$:${SANITIZE_OPTIONS}>) # === 输出目录配置 === set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # === 路径配置 === set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(INCLUDE_DIR ${SRC_DIR}) # 核心交付目录【复用,无需修改】 set(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" CACHE PATH "交付目录路径") get_filename_component(DELIVER_DIR ${DELIVER_DIR} ABSOLUTE) message(STATUS "交付目录: ${DELIVER_DIR}") set(CCOSLOCK_INCLUDE_DIR "${DELIVER_DIR}/include") set(CCOSLOCK_LIB_DIR "${DELIVER_DIR}/lib") get_filename_component(CCOSLOCK_INCLUDE_DIR ${CCOSLOCK_INCLUDE_DIR} ABSOLUTE) get_filename_component(CCOSLOCK_LIB_DIR ${CCOSLOCK_LIB_DIR} ABSOLUTE) message(STATUS "CcosLock 头文件目录: ${CCOSLOCK_INCLUDE_DIR}") message(STATUS "CcosLock 库文件目录: ${CCOSLOCK_LIB_DIR}") set(CRC64_INCLUDE_DIR "${DELIVER_DIR}/include") set(CRC64_LIB_DIR "${DELIVER_DIR}/lib") get_filename_component(CRC64_INCLUDE_DIR ${CRC64_INCLUDE_DIR} ABSOLUTE) get_filename_component(CRC64_LIB_DIR ${CRC64_LIB_DIR} ABSOLUTE) message(STATUS "Crc64 头文件目录: ${CRC64_INCLUDE_DIR}") message(STATUS "Crc64 库文件目录: ${CRC64_LIB_DIR}") # === 源文件与头文件 === set(SRC_FILES ${SRC_DIR}/PacketAnalizer.cpp ) set(HEADER_FILES ${INCLUDE_DIR}/PacketAnalizer.h ) # 验证当前工程头文件是否存在 foreach(header ${HEADER_FILES}) if(NOT EXISTS ${header}) message(FATAL_ERROR "头文件不存在: ${header}") endif() endforeach() if(NOT EXISTS "${CCOSLOCK_INCLUDE_DIR}/CcosLock.h") message(FATAL_ERROR "CcosLock.h 不存在于 ${CCOSLOCK_INCLUDE_DIR}") endif() if(NOT EXISTS "${CRC64_INCLUDE_DIR}/Crc64.h") message(FATAL_ERROR "Crc64.h 不存在于 ${CRC64_INCLUDE_DIR}") endif() find_library(CCOSLOCK_LIB NAMES CcosLock libCcosLock # 同时检查带/不带lib前缀的库名 PATHS ${CCOSLOCK_LIB_DIR} NO_DEFAULT_PATH # 只在指定目录查找,不搜索系统默认路径 ) if(NOT CCOSLOCK_LIB) message(FATAL_ERROR "找不到CcosLock库,路径: ${CCOSLOCK_LIB_DIR}") else() message(STATUS "找到CcosLock库: ${CCOSLOCK_LIB}") endif() find_library(CRC64_LIB NAMES Crc64 libCrc64 # 同时检查带/不带lib前缀的库名 PATHS ${CRC64_LIB_DIR} NO_DEFAULT_PATH # 只在指定目录查找,不搜索系统默认路径 ) if(NOT CRC64_LIB) message(FATAL_ERROR "找不到Crc64库,路径: ${CRC64_LIB_DIR}") else() message(STATUS "找到Crc64库: ${CRC64_LIB}") endif() # === 构建共享库 === add_library(CommonPacket SHARED ${SRC_FILES} ${HEADER_FILES}) # === 目标属性配置 === set_target_properties(CommonPacket PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 OUTPUT_NAME "CommonPacket" PUBLIC_HEADER "${HEADER_FILES}" ) # === 编译选项 === if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") target_compile_options(CommonPacket PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(CommonPacket PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type) endif() # === 依赖配置 - 头文件目录 === target_include_directories(CommonPacket PUBLIC $ $ $ # 【新增】添加CRC64头文件目录 $ ) # === 依赖配置 - 链接库【核心修改】=== # 同时链接:CcosLock + Crc64 + pthread + dl,所有依赖一次性配置完成 target_link_libraries(CommonPacket PUBLIC ${CCOSLOCK_LIB} # 原有:CcosLock库 ${CRC64_LIB} # 新增:Crc64/libCrc库 PRIVATE pthread dl ) # === 交付与安装 === file(MAKE_DIRECTORY ${DELIVER_DIR}/lib ${DELIVER_DIR}/include ) add_custom_command(TARGET CommonPacket POST_BUILD COMMENT "复制构建产物到交付目录: ${DELIVER_DIR}" # 1. 确保交付目录存在(避免链接/复制失败) COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/lib" COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/include" # 2. 复制核心库文件(唯一真实二进制文件,如 libCommonPacket.so.1.0.0) COMMAND ${CMAKE_COMMAND} -E echo "复制CommonPacket核心库文件..." COMMAND ${CMAKE_COMMAND} -E copy_if_different "$" # 源:完整版本核心库(含全版本号) "${DELIVER_DIR}/lib/" # 目标:交付目录的lib文件夹 # 3. 创建主版本符号链接(如 libCommonPacket.so.1 -> libCommonPacket.so.1.0.0) COMMAND ${CMAKE_COMMAND} -E echo "创建CommonPacket主版本符号链接..." COMMAND ${CMAKE_COMMAND} -E create_symlink "$" # 链接指向的目标(核心库文件名) "${DELIVER_DIR}/lib/$" # 链接文件本身(主版本名) # 4. 创建通用符号链接(如 libCommonPacket.so -> libCommonPacket.so.1) COMMAND ${CMAKE_COMMAND} -E echo "创建CommonPacket通用符号链接..." COMMAND ${CMAKE_COMMAND} -E create_symlink "$" # 链接指向的目标(主版本链接名) "${DELIVER_DIR}/lib/$" # 链接文件本身(通用名) # 5. 复制头文件(保持原逻辑,确保头文件正确交付) COMMAND ${CMAKE_COMMAND} -E echo "复制CommonPacket头文件..." COMMAND ${CMAKE_COMMAND} -E copy_if_different ${HEADER_FILES} ${DELIVER_DIR}/include/ ) # 安装配置 install(TARGETS CommonPacket EXPORT CommonPacketTargets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include ) install(EXPORT CommonPacketTargets FILE CommonPacketConfig.cmake DESTINATION lib/cmake/CommonPacket EXPORT_LINK_INTERFACE_LIBRARIES ) # === 调试辅助 - 【新增CRC64日志】=== message(STATUS "CommonPacket 源文件: ${SRC_FILES}") message(STATUS "CommonPacket 头文件: ${HEADER_FILES}") message(STATUS "CommonPacket 链接库: ${CCOSLOCK_LIB} ${CRC64_LIB} pthread dl")