Linux(Ubuntu)无root权限编译安装Eigen3以及遇到的问题-Could NOT find Eigen3

无root权限编译安装Eigen3可以参考这篇博客:Eigen3安装,注意因为是无root权限,所以按照链接里的第二个安装方法安装,并且最后一个sudo make install 要去掉 sudo,直接使用make install

我是在安装colmap的时候用到Eigen3这个库的,但是按上面的方法安装完Eigen3之后还是报错Could NOT find Eigen3,追溯报错源头之后发现:

由于没有root权限,我把Eigen3放在了自己的文件夹下面,而不是eigen3的cmake中的FindEigen3.cmake默认的路径,所以一直报错Could NOT find Eigen3

既然找到了原因,对症下药即可:

在eigen3的cmake中的FindEigen3.cmake中添加语句(大家修改之前记得保留原来的FindEigen3.cmake文件备份,主要防止改错了不知道怎么改回去)

set(EIGEN3_INCLUDE_DIR "你放置Eigen3的绝对路径/include/")
INCLUDE_DIRECTORIES ( "${EIGEN3_INCLUDE_DIR}" )

这样就行了,同时注意,如果你是像我一样在安装colmap或者其他库的时候报错Could NOT find Eigen3,那还需要将相应库的FindEigen3.cmake文件(比如colmap的在colmap下的cmake文件夹中)也这样修改。

如果你不知道你的库里FindEigen3.cmake文件在哪,用 find 命令找一下就行:


                
<think>我们正在解决CMake中找不到Eigen3和pybind11的配置文件的问题。根据引用内容,我们可以总结出以下方法:对于Eigen3:1.方法一:提供FindEigen3.cmake文件(当Eigen3没有提供配置文件时)-在工程目录下新建一个cmake文件夹,并将找到的FindEigen3.cmake文件放入其中。-在CMakeLists.txt中设置CMAKE_MODULE_PATH包含这个目录:`set(CMAKE_MODULE_PATH${PROJECT_SOURCE_DIR}/cmake)`-然后使用`find_package(Eigen3REQUIRED)`2.方法二:设置Eigen3_DIR(当Eigen3提供了配置文件,但CMake找不到时)-首先需要找到Eigen3安装时提供的配置文件(如Eigen3Config.cmake或eigen3-config.cmake)所在的目录。-在CMakeLists.txt中设置这个目录到Eigen3_DIR:`set(Eigen3_DIR<path-to-directory-containing-cmake-file>)`-或者将Eigen3安装前缀添加到CMAKE_PREFIX_PATH:`set(CMAKE_PREFIX_PATH${CMAKE_PREFIX_PATH}<eigen3-install-prefix>)`3.方法三:使用NO_CMAKE_FIND_ROOT_PATH选项(当交叉编译时,可能需要忽略根路径)-`find_package(Eigen3REQUIREDNO_CMAKE_FIND_ROOT_PATH)`对于pybind11:根据引用[4],我们可以通过以下方式安装和配置:1.使用git克隆pybind11的CMake示例项目(注意:这里安装的是示例项目,但实际我们可能需要的是pybind11本身):```gitclone--recursivehttps://github.com/pybind/cmake_example.gitpipinstall./cmake_example```但更常见的做法是:-使用find_package:pybind11提供了配置文件,所以我们可以通过设置pybind11_DIR或者将pybind11的安装目录添加到CMAKE_PREFIX_PATH中。-或者使用add_subdirectory:如果我们将pybind11作为子模块添加到项目中。具体步骤:**Eigen3的配置:**方法一(推荐,如果Eigen3是通过系统包管理器安装的,通常不需要Find模块,因为新版本Eigen3提供了配置文件):-确保Eigen3已正确安装(例如在Ubuntu上:`sudoaptinstalllibeigen3-dev`)-如果Eigen3的配置文件在标准路径下(如/usr/lib/cmake/eigen3),CMake会自动找到。如果不在,则需要设置Eigen3_DIR。方法二(手动提供FindEigen3.cmake):-适用于旧版本Eigen3或没有配置文件的情况。-从网络获取FindEigen3.cmake(例如从其他项目复制),然后按照方法一中的步骤设置CMAKE_MODULE_PATH。**pybind11的配置:**方法一(通过pip安装):-安装pybind11:`pipinstallpybind11`-然后,在CMakeLists.txt中,使用:```cmakefind_package(pybind11REQUIRED)```如果CMake找不到,可以设置pybind11_DIR指向pybind11安装的cmake目录(例如在Python的site-packages目录中:`<python_site_packages>/pybind11/share/cmake/pybind11`)方法二(作为子模块):-将pybind11作为git子模块添加到项目中:```gitsubmoduleaddhttps://github.com/pybind/pybind11.git```-然后在CMakeLists.txt中:```cmakeadd_subdirectory(pybind11)```方法三(使用find_package,并指定路径):-如果pybind11安装在非标准路径,可以设置CMAKE_PREFIX_PATH或pybind11_DIR:```cmakeset(pybind11_DIR<path_to_pybind11_cmake_dir>)find_package(pybind11REQUIRED)```**综合解决方案:**假设我们有一个项目,同时需要Eigen3和pybind11,并且我们使用系统安装Eigen3(已提供配置文件)和通过pip安装的pybind11。CMakeLists.txt示例:```cmakecmake_minimum_required(VERSION3.10)project(MyProject)#设置Eigen3:假设Eigen3安装在标准位置,则直接查找find_package(Eigen3REQUIRED)#设置pybind11:如果通过pip安装,可能需要指定pybind11_DIR#例如,在Linux上,pybind11的cmake文件可能在:/usr/local/lib/python3.8/dist-packages/pybind11/share/cmake/pybind11#或者使用以下方法自动查找(如果pybind11安装在CMake的搜索路径中)find_package(pybind11REQUIRED)#如果找不到,可以手动设置路径#list(APPENDCMAKE_PREFIX_PATH"/path/to/pybind11")#或者#set(pybind11_DIR"/path/to/pybind11/share/cmake/pybind11")#添加可执行文件或库add_executable(my_targetmain.cpp)#链接库target_link_libraries(my_targetPRIVATEEigen3::Eigenpybind11::module)```如果Eigen3不是安装在标准路径,可以在运行cmake时指定:```bashcmake-DEigen3_DIR=/path/to/eigen3/share/eigen3/cmake..```或者将路径添加到CMakeLists.txt中:```cmakeset(Eigen3_DIR"/path/to/eigen3/share/eigen3/cmake")find_package(Eigen3REQUIRED)```**注意事项:**-Eigen3通常不需要链接具体的库,因为它是一个头文件库,所以使用`Eigen3::Eigen`目标主要是为了包含路径。-pybind11需要链接`pybind11::module`或`pybind11::embed`等目标。如果上述方法仍不能解决,请检查:1.软件包是否安装正确。2.路径是否正确。3.CMake版本是否满足要求。§§相关问题§§1.如何检查Eigen3或pybind11是否已正确安装并提供CMake配置文件?2.在交叉编译环境下如何配置Eigen3和pybind11?3.如何将Eigen3和pybind11作为项目的子模块使用?</think>### 解决CMake中Eigen3和pybind11配置问题 #### 问题原因 当CMake找不到`FindEigen3.cmake`或`Findpybind11.cmake`时,通常是由于: 1. **路径配置错误**:CMake未在`CMAKE_MODULE_PATH`或`CMAKE_PREFIX_PATH`中定位到配置文件 2. **包未正确安装**:Eigen3/pybind11未安装或未提供CMake配置文件 3. **配置文件缺失**:旧版Eigen3需手动添加`FindEigen3.cmake` --- #### 解决方案 **方法1:添加自定义Find模块(推荐)** ```cmake # 在项目根目录创建cmake/文件夹,放入FindEigen3.cmake和Findpybind11.cmake set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) find_package(Eigen3 REQUIRED) find_package(pybind11 REQUIRED) ``` > 配置文件来源: > - [FindEigen3.cmake模板](https://gitlab.com/libeigen/eigen/-/blob/master/cmake/FindEigen3.cmake) > - [pybind11配置文件](https://github.com/pybind/pybind11/blob/master/cmake/Findpybind11.cmake) **方法2:设置安装前缀路径** ```cmake # 指定Eigen3/pybind11的安装前缀 set(CMAKE_PREFIX_PATH "/usr/local/eigen3" "/usr/local/pybind11" ${CMAKE_PREFIX_PATH} ) find_package(Eigen3 REQUIRED) find_package(pybind11 REQUIRED) ``` **方法3:直接指定配置文件目录** ```cmake # 适用于提供Config.cmake的版本 set(Eigen3_DIR "/path/to/eigen3/share/eigen3/cmake") set(pybind11_DIR "/path/to/pybind11/share/cmake/pybind11") find_package(Eigen3 REQUIRED) find_package(pybind11 REQUIRED) ``` **方法4:添加NO_CMAKE_FIND_ROOT_PATH标志(交叉编译时)** ```cmake find_package(Eigen3 REQUIRED NO_CMAKE_FIND_ROOT_PATH) find_package(pybind11 REQUIRED NO_CMAKE_FIND_ROOT_PATH) ``` --- #### 验证配置成功 在`find_package()`后添加检查: ```cmake if(Eigen3_FOUND) message(STATUS "Eigen3 found: ${EIGEN3_INCLUDE_DIR}") endif() if(pybind11_FOUND) message(STATUS "pybind11 found: ${pybind11_INCLUDE_DIR}") endif() ``` --- #### 安装依赖的正确方法 1. **Eigen3**(Ubuntu): ```bash sudo apt install libeigen3-dev # 验证安装路径:dpkg -L libeigen3-dev ``` 2. **pybind11**(Python安装): ```bash pip install pybind11 # 获取CMake路径:python -c "import pybind11; print(pybind11.get_cmake_dir())" ``` --- #### 典型目录结构 ``` project_root/ ├── cmake/ │ ├── FindEigen3.cmake # 手动添加 │ └── Findpybind11.cmake # 手动添加 ├── CMakeLists.txt # 配置CMAKE_MODULE_PATH └── src/ ``` > **关键点**:新版Eigen3(≥3.3)通常提供`Eigen3Config.cmake`,无需手动添加Find模块[^2]。pybind11通过Python安装后会自动提供CMake配置文件[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值