我想使用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工作正常(学习和测试)。
现在我想知道为什么以前的方法不起作用。