如何通过CMake查找自定义编译Python的Interpreter和Development组件
问题根因
- Python 3.6这类早期版本编译安装时不会原生生成CMake可识别的
Python3Config.cmake配置文件,默认Config模式搜索会失败 - 你自行编写的
Python3Config.cmake缺少必填的版本校验、组件状态标识逻辑,CMake会判定该配置文件无效,直接忽略 - 未指定
MODULE参数时,CMake会优先尝试Config模式搜索,失败后也不会主动回退到内置FindPython3模块的文件搜索逻辑,尤其在你指定了NO_DEFAULT_PATH参数的情况下
解决方案
方案1(推荐,无需修改Python安装目录)
强制使用CMake内置的FindPython3模块(Module模式)搜索,通过构建参数传入根目录,完全不需要硬编码路径:
- 保持CMakeLists.txt中的
find_package逻辑如下,添加MODULE参数强制使用模块模式:
find_package(Python3 3.6 EXACT MODULE COMPONENTS Interpreter Development REQUIRED)
- 构建时通过命令行传入自定义Python的根目录即可,不需要修改系统PATH:
cmake -S 源码目录 -B 构建目录 -DPython3_ROOT_DIR=/path/to/py3.6.15
方案2(保留Config模式使用场景)
补全你自行编写的Python3Config.cmake的必填逻辑,放入/path/to/py3.6.15目录下即可:
# 版本声明,匹配你安装的Python版本 set(Python3_VERSION 3.6.15) set(Python3_VERSION_MAJOR 3) set(Python3_VERSION_MINOR 6) set(Python3_VERSION_PATCH 15) # 路径配置 set(Python3_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/bin/python3) set(Python3_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/include/python3.6m) set(Python3_LIBRARY_DIRS ${CMAKE_CURRENT_LIST_DIR}/lib) set(Python3_LIBRARIES ${CMAKE_CURRENT_LIST_DIR}/lib/libpython3.6m.so) set(Python3_STDLIB ${CMAKE_CURRENT_LIST_DIR}/lib/python3.6) # 组件校验逻辑 foreach(comp ${Python3_FIND_COMPONENTS}) if(comp STREQUAL "Interpreter" AND EXISTS ${Python3_EXECUTABLE}) set(Python3_Interpreter_FOUND TRUE) elseif(comp STREQUAL "Development" AND EXISTS ${Python3_INCLUDE_DIRS} AND EXISTS ${Python3_LIBRARIES}) set(Python3_Development_FOUND TRUE) endif() endforeach()
使用该方案时不需要额外加MODULE参数,构建时指定PATHS或者Python3_ROOT_DIR均可正常识别。
验证方式
构建完成后可在CMakeLists中添加以下代码校验搜索结果:
if(Python3_FOUND) message(STATUS "找到Python 3.6: 解释器路径=${Python3_EXECUTABLE}, 头文件路径=${Python3_INCLUDE_DIRS}") endif()
内容的提问来源于stack exchange,提问作者AlQuemist
相关产品推荐
相关产品推荐

