使用正确版本的Eigen3与Cmake



我想使用Eigen不支持的模块NNLS,但在我的默认版本Eigen 3.4.0中,我没有该文件,所以我下载了最新版本Eigen 3.4.90,并使用-DCMAKE_PREFIX_PATH=/home/path/to/my/prefix安装了它。

我使用Cmake来构建我的项目,我的简化CMakeLists.txt是:

cmake_minimum_required(VERSION 3.16.0)
project(my_project VERSION 0.1.0)
find_package(Eigen3 3.4.90 REQUIRED NO_MODULE)
set(SOURCE_FILES main.cpp)
add_executable(my_project ${SOURCE_FILES})
target_link_libraries(my_project PUBLIC
Eigen3::Eigen
)

检查Cmake找到正确的版本,我检查了变量${Eigen3_DIR},我得到:/home/path/To/my/prefix/share/eigen3/Cmake .

然而,我一直无法使用3.4.90版本。每当我包含

#include <eigen3/unsupported/Eigen/NNLS>

编译器(gcc 11.3.0)说这样的目录不存在,当我写像

这样的东西时
#include <eigen3/Eigen/Dense>

VScode将我发送到usr/include中的文件,也就是说,它检测到3.4.0版本。

如何使用最新版本?

OS: Ubuntu 22.04

一个选项是用3.4.90替换3.4.0版本,但我不知道如何正确地做到这一点。如果我只安装3.4.90版本,它会自动删除旧版本吗?

另一方面,如果将来我想保留旧版本,我想学习如何做到这一点。

我找到了一个解决方案(也是我的新手错误)。我把问题简化了,放到这里。

我在我的库中使用了eigen3

My_project/
|- CMakeLists.txt(*)
|- main.cpp
|- lib/
|- CMakeLists.txt(**)
|- my_lib.h
|- my_lib.cpp

我在CMakeLists.txt(*)中使用了find_package,但我将其包含在my_lib.h中。我这样做是因为它与gnuplot-iostream和sigpack一起工作,所以我也这样做了。现在我有

# CMakeLists.txt(**)
find_package(Eigen3 3.4.90 REQUIRED NO_MODULE)
add_library(MyLib 
my_lib.cpp
)
target_link_libraries(MyLib PUBLIC
Eigen3::Eigen
)

现在,我有两个版本,当我问VSCode "去定义",它给我正确的版本。

包含文件NNLS I类型

#include <unsupported/Eigen/NNLS>

但是,它没有找到

#include <eigen3/unsupported/Eigen/NNLS>

项目现在编译良好,看起来NNLS工作正常(学习和测试)。

现在我想知道为什么以前的方法不起作用。

相关内容

  • 没有找到相关文章

最新更新