Ubuntu20.04编译gtsam时找不到pybind11/eigen.h的解决方法
解决GTSAM编译时找不到pybind11/eigen.h的问题
问题背景
在Ubuntu 20.04系统上,使用Python 3.8.10和CMake 3.26.0编译GTSAM库时,执行以下命令:
git clone https://github.com/borglab/gtsam.git cd gtsam mkdir build && cd build cmake .. -DGTSAM_BUILD_PYTHON=1 -DGTSAM_PYTHON_VERSION=3.8.10 -Dpybind11_INCLUDE_DIR=/home/user/Downloads/gtsam/wrap/pybind11/include make -j$(nproc)
出现编译错误,提示找不到pybind11/eigen.h头文件,具体错误信息:
/home/user/Downloads/gtsam/build/python/gtsam.cpp:12:10: fatal error: pybind11/eigen.h: No such file or directory 12 | #include <pybind11/eigen.h> | ^~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [python/CMakeFiles/gtsam_py.dir/build.make:188: python/CMakeFiles/gtsam_py.dir/gtsam.cpp.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:32610: python/CMakeFiles/gtsam_py.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs....
解决方案
1. 补全GTSAM的pybind11子模块
GTSAM的pybind11依赖以Git子模块形式存在,直接克隆仓库时可能未自动拉取子模块内容,导致头文件缺失。执行以下命令补全子模块:
cd /home/user/Downloads/gtsam git submodule update --init --recursive
完成后清空build目录重新编译:
rm -rf build && mkdir build && cd build cmake .. -DGTSAM_BUILD_PYTHON=1 -DGTSAM_PYTHON_VERSION=3.8.10 -Dpybind11_INCLUDE_DIR=/home/user/Downloads/gtsam/wrap/pybind11/include make -j$(nproc)
2. 修正pybind11_INCLUDE_DIR路径
若子模块已完整,检查pybind11/eigen.h实际位置:该文件通常位于/home/user/Downloads/gtsam/wrap/pybind11/include/pybind11/eigen.h,此时CMake参数中的pybind11_INCLUDE_DIR需指向包含pybind11文件夹的上级目录(即原路径无需修改,若子模块正确克隆则此路径有效)。
3. 使用系统安装的pybind11
不想依赖仓库自带子模块时,可通过apt安装系统版本:
sudo apt update && sudo apt install pybind11-dev
去掉CMake命令中的-Dpybind11_INCLUDE_DIR参数,让CMake自动查找系统安装的pybind11:
rm -rf build && mkdir build && cd build cmake .. -DGTSAM_BUILD_PYTHON=1 -DGTSAM_PYTHON_VERSION=3.8.10 make -j$(nproc)
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

