You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让CMake的find_package找到PyPI安装的pybind11依赖?

解决CMake定位PyPI安装的pybind11问题

先明确<prefix>/的含义

<prefix>指的是依赖包的根目录。对你通过PyPI安装的pybind11来说,它的prefix就是...\Python311\Lib\site-packages\pybind11——因为CMake标准配置文件路径share/cmake/pybind11是相对于这个根目录的。

让CMake找到pybind11的几种有效配置方法

方法1:设置CMAKE_PREFIX_PATH变量

CMake会自动在CMAKE_PREFIX_PATH指定的路径下搜索share/cmake目录,你可以通过两种方式设置:

  • 命令行传参:运行cmake时直接指定路径(替换为你实际的pybind11根目录):
    cmake .. -DCMAKE_PREFIX_PATH="...\Python311\Lib\site-packages\pybind11"
    
  • CMakeLists.txt中设置:在project()指令前添加:
    set(CMAKE_PREFIX_PATH "...\Python311\Lib\site-packages\pybind11")
    project(YourProjectName)
    find_package(pybind11 REQUIRED)
    

方法2:直接指定pybind11_DIR变量

既然你已经知道pybind11Config.cmake的具体路径,可以直接告诉CMake这个文件的所在目录:

  • 命令行传参:
    cmake .. -Dpybind11_DIR="...\Python311\Lib\site-packages\pybind11\share\cmake\pybind11"
    
  • CMakeLists.txt中设置:放在find_package指令前:
    set(pybind11_DIR "...\Python311\Lib\site-packages\pybind11\share\cmake\pybind11")
    find_package(pybind11 REQUIRED)
    

方法3:自动获取Python site-packages路径(灵活适配不同环境)

如果不想硬编码路径,可以通过CMake调用Python自动获取site-packages目录:

# 先找到Python解释器
find_package(Python3 REQUIRED COMPONENTS Interpreter)
# 执行Python命令获取site-packages路径
execute_process(
    COMMAND ${Python3_EXECUTABLE} -c "import site; print(site.getsitepackages()[0])"
    OUTPUT_VARIABLE PYTHON_SITE_PACKAGES
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
# 拼接pybind11的CMake配置文件路径
set(pybind11_DIR "${PYTHON_SITE_PACKAGES}/pybind11/share/cmake/pybind11")
find_package(pybind11 REQUIRED)

验证配置是否生效

可以在CMakeLists.txt中添加以下代码,查看CMake的搜索路径和找到的pybind11信息:

message("当前CMAKE_PREFIX_PATH:${CMAKE_PREFIX_PATH}")
message("当前pybind11_DIR:${pybind11_DIR}")
find_package(pybind11 REQUIRED)
message("找到的pybind11版本:${pybind11_VERSION}")

内容的提问来源于stack exchange,提问作者memelord23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:57:41