如何在CMake中禁止针对旧版本共享库编译(以Glibc为例)
如何在CMake中禁止针对旧版本共享库编译(以Glibc为例)
当然有办法解决这个问题!我之前处理过类似的版本兼容性需求,在CMake里可以通过配置阶段检查Glibc版本的方式,直接阻止旧版本系统的编译,而且完全不需要链接特定版本的库。下面给你两种靠谱的实现方式:
方法一:通过系统命令获取版本并检查
这种方式简单直接,利用Glibc自带的getconf命令获取版本信息,再用CMake的版本比较功能判断是否符合要求:
# 获取Glibc版本信息(输出格式通常是 "glibc 2.38" 这类) execute_process( COMMAND getconf GNU_LIBC_VERSION OUTPUT_VARIABLE GLIBc_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ) # 从输出中提取纯版本号(比如从"glibc 2.38"拿到"2.38") string(REGEX MATCH "[0-9]+\\.[0-9]+" GLIBc_VERSION "${GLIBc_VERSION_OUTPUT}") # 检查版本是否小于等于2.3.3,如果是则终止配置并报错 if(GLIBc_VERSION VERSION_LESS_EQUAL "2.3.3") message(FATAL_ERROR "当前系统的Glibc版本为 ${GLIBc_VERSION},版本过低!本项目要求使用2.3.3以上的Glibc版本。") endif()
方法二:通过编译测试检查头文件宏(更可靠)
如果担心某些系统的getconf输出格式不一致,或者想直接和编译时实际使用的Glibc版本对齐,可以通过编译一个小测试程序来检查头文件里的版本宏:
首先,在你的项目目录下创建一个名为check_glibc_version.c的文件,内容如下:
#include <gnu/libc-version.h> // 如果Glibc主版本<=2且次版本<=3,触发编译错误 #if (__GLIBC__ <= 2 && __GLIBC_MINOR__ <= 3) #error "Glibc版本过低,需要2.3.3以上版本" #endif int main() { return 0; }
然后在CMakeLists.txt中添加这段代码,调用try_compile来测试编译:
# 编译测试程序,判断Glibc版本是否符合要求 try_compile( GLIBc_VERSION_OK ${CMAKE_BINARY_DIR}/glibc_check SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/check_glibc_version.c ) # 如果测试编译失败(说明版本过低),终止配置并报错 if(NOT GLIBc_VERSION_OK) message(FATAL_ERROR "检测到当前系统Glibc版本过低,本项目要求使用2.3.3以上的版本,请升级后再尝试编译。") endif()
这两种方法都是在CMake的配置阶段就完成检查,一旦发现版本不符合要求,会直接终止配置流程,不会进入后续的编译环节,完全满足你的需求——既阻止旧版本编译,又不需要链接特定版本的Glibc。
备注:内容来源于stack exchange,提问作者user18812922
相关产品推荐
相关产品推荐

