CMake能否在配置阶段检测到链接不兼容库并报错?
在CMake配置阶段检测不兼容库的链接并报错
CMake本身不会自动识别库的二进制兼容性,但既然你已经明确libA与libB不兼容,可以通过自定义CMake逻辑,在配置阶段就检测目标是否同时链接了这两个库,一旦触发就直接抛出错误,避免进入编译阶段。
实现方案
基于你的最小示例,添加如下检查逻辑:
1. 基础检查代码
在target_link_libraries语句之后,加入检测逻辑:
cmake_minimum_required(VERSION 3.20) project(sample) add_library(libA A.cpp A.h) add_library(libB B.cpp B.h) add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} libA libB) # 检测是否同时链接了不兼容的库 get_target_property(LINKED_LIBS ${PROJECT_NAME} LINK_LIBRARIES) set(has_libA OFF) set(has_libB OFF) foreach(lib IN LISTS LINKED_LIBS) if(lib STREQUAL "libA") set(has_libA ON) elseif(lib STREQUAL "libB") set(has_libB ON) endif() endforeach() if(has_libA AND has_libB) message(FATAL_ERROR "错误:libA与libB不兼容,无法同时链接到目标${PROJECT_NAME}") endif()
2. 封装为可复用函数
如果需要在多个目标中复用该检查,可以封装成CMake函数:
function(check_incompatible_pair target lib1 lib2) get_target_property(linked_libs ${target} LINK_LIBRARIES) if(NOT linked_libs) return() endif() set(found_lib1 OFF) set(found_lib2 OFF) foreach(lib IN LISTS linked_libs) if(lib STREQUAL ${lib1}) set(found_lib1 ON) elseif(lib STREQUAL ${lib2}) set(found_lib2 ON) endif() endforeach() if(found_lib1 AND found_lib2) message(FATAL_ERROR "错误:库${lib1}与${lib2}不兼容,不能同时链接到目标${target}") endif() endfunction() # 调用示例 check_incompatible_pair(${PROJECT_NAME} libA libB)
效果说明
当目标同时链接libA和libB时,CMake在配置阶段就会直接抛出FATAL_ERROR,终止配置流程,不会进入后续的编译环节;如果只链接其中一个库,则配置正常执行。
内容的提问来源于stack exchange,提问作者user3667089
相关产品推荐
相关产品推荐

