cmake_minimum_required(VERSION 3.12) project(common_api 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}) # 配置ResDataObject相关路径(明确指定位置) set(RES_DATA_INCLUDE_DIR "${CMAKE_BINARY_DIR}/../../Deliver/include") set(RES_DATA_LIB_DIR "${CMAKE_BINARY_DIR}/../../Deliver/lib") # 明确设置ResDataObject库所在目录 get_filename_component(RES_DATA_INCLUDE_DIR ${RES_DATA_INCLUDE_DIR} ABSOLUTE) get_filename_component(RES_DATA_LIB_DIR ${RES_DATA_LIB_DIR} ABSOLUTE) message(STATUS "ResDataObject 头文件目录: ${RES_DATA_INCLUDE_DIR}") message(STATUS "ResDataObject 库文件目录: ${RES_DATA_LIB_DIR}") set(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" CACHE PATH "交付目录路径") get_filename_component(DELIVER_DIR ${DELIVER_DIR} ABSOLUTE) message(STATUS "交付目录: ${DELIVER_DIR}") # === 源文件与头文件 === set(SRC_FILES ${SRC_DIR}/common_api.cpp ) set(HEADER_FILES ${INCLUDE_DIR}/common_api.h ) # 验证头文件是否存在 foreach(header ${HEADER_FILES}) if(NOT EXISTS ${header}) message(FATAL_ERROR "头文件不存在: ${header}") endif() endforeach() # 验证ResDataObject相关文件是否存在 if(NOT EXISTS "${RES_DATA_INCLUDE_DIR}/ResDataObject.h") message(FATAL_ERROR "ResDataObject.h 不存在于 ${RES_DATA_INCLUDE_DIR}") endif() # 查找ResDataObject库(精确匹配指定目录) find_library(RES_DATA_LIB NAMES ResDataObject libResDataObject # 同时检查带lib前缀和不带前缀的库名 PATHS ${RES_DATA_LIB_DIR} NO_DEFAULT_PATH # 只在指定目录查找,不搜索系统默认路径 ) if(NOT RES_DATA_LIB) # 找不到库时列出目录内容帮助调试 message(FATAL_ERROR "找不到ResDataObject库,路径: ${RES_DATA_LIB_DIR}\n目录内容: $(ls ${RES_DATA_LIB_DIR})") else() message(STATUS "找到ResDataObject库: ${RES_DATA_LIB}") endif() # === 构建共享库 === add_library(common_api SHARED ${SRC_FILES} ${HEADER_FILES}) # === 目标属性配置 === set_target_properties(common_api PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 OUTPUT_NAME "common_api" PUBLIC_HEADER "${HEADER_FILES}" ) # === 编译选项 === if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") target_compile_options(common_api PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(common_api PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type) endif() # === 依赖配置 === target_include_directories(common_api PUBLIC $ $ $ ) # 链接ResDataObject库和系统库 target_link_libraries(common_api PUBLIC ${RES_DATA_LIB} # 链接ResDataObject库 PRIVATE pthread dl ) # === 交付与安装 === file(MAKE_DIRECTORY ${DELIVER_DIR}/lib ${DELIVER_DIR}/include ) add_custom_command(TARGET common_api 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. 复制核心库文件(唯一真实二进制文件,如 libcommon_api.so.1.0.0) COMMAND ${CMAKE_COMMAND} -E echo "复制common_api核心库文件..." COMMAND ${CMAKE_COMMAND} -E copy_if_different "$" # 源:完整版本核心库(含全版本号) "${DELIVER_DIR}/lib/" # 目标:交付目录的lib文件夹 # 3. 创建主版本符号链接(如 libcommon_api.so.1 -> libcommon_api.so.1.0.0) COMMAND ${CMAKE_COMMAND} -E echo "创建common_api主版本符号链接..." COMMAND ${CMAKE_COMMAND} -E create_symlink "$" # 链接指向的目标(核心库文件名) "${DELIVER_DIR}/lib/$" # 链接文件本身(主版本名) # 4. 创建通用符号链接(如 libcommon_api.so -> libcommon_api.so.1) COMMAND ${CMAKE_COMMAND} -E echo "创建common_api通用符号链接..." COMMAND ${CMAKE_COMMAND} -E create_symlink "$" # 链接指向的目标(主版本链接名) "${DELIVER_DIR}/lib/$" # 链接文件本身(通用名) # 5. 复制头文件(保持原逻辑,确保头文件正确交付) COMMAND ${CMAKE_COMMAND} -E echo "复制common_api头文件..." COMMAND ${CMAKE_COMMAND} -E copy_if_different ${HEADER_FILES} ${DELIVER_DIR}/include/ ) # 安装配置 install(TARGETS common_api EXPORT common_apiTargets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include ) install(EXPORT common_apiTargets FILE common_apiConfig.cmake DESTINATION lib/cmake/common_api EXPORT_LINK_INTERFACE_LIBRARIES ) # === 调试辅助 === message(STATUS "common_api 源文件: ${SRC_FILES}") message(STATUS "common_api 头文件: ${HEADER_FILES}") message(STATUS "common_api 链接库: ${RES_DATA_LIB} pthread dl")