VS2019已经在vc++目录中加入eigen的目录为什么还是提示找不到eigen/dense源函数?
最近在使用Visual Studio时想使用一下著名的矩阵运算库:Eigen,摸索了一下如何在Visual Studio中配置。
1 下载Eigen源码
直接到Eigen官网 Eigen ,这里我选择3.3.8版本
2 在VS中创建一个空项目
这里先创建一个空项目
这里演示选择空模板
这里注意,一个解决方案中可以包含多个项目,如果勾选了
将解决方案和项目放在同一目录
,在这个解决方案里再添加项目,项目的文件夹就也在Desktop目录下,不便于管理。不勾选的话相当于在Desktop/下创建一个Solution文件夹,存放解决方案,Solution/中同时又创建了Project1文件夹,存放Project1的项目文件。在添加项目时就会在Solution/目录下,而不是Desktop/。(这里以下图在Desktop目录下的情况说明问题)
创建完成后会进入VS中,VS中解决资源管理器默认是展示头文件、源文件这些,如下图。
但我们在做项目时,往往按照src、include、config、deps这些文件夹去管理工程文件,因此需要做一些修改。
首先在项目目录下创建src、include、deps、config等文件夹,src存放源文件、include存放头文件、deps用于放置外部库,这里我们的Eigen就解压存放到在这里,最终创建好的目录如下(为了展示文件结构用vs code打开的,这里只要注意eigen的所有文件在deps/eigen目录下,有时候解压软件会创建两层文件夹):
打开
显示所有文件
,就可以看到每个工程文件夹了
3 设置项目属性,添加Eigen
直接在项目上右键-->属性,然后在属性页上选择
配置
-->
所有配置
、
平台
-->
所有平台
,我这里项目需要还改了解决方案平台为
x64
、C17标准。
现在在属性配置中有常规、高级等标签,而我们需要在
C/C++
标签下进行配置,如下图
那么怎么调出这个标签呢?具体方法如下:
在src中随便添加一个C++文件,这里命名为
test_eigen.cpp
,然后再右键项目属性,就会出现
C/C++
标签了。
进入标签页后,可以看到第一个是 附加包含目录 ,这里将我们的Eigen目录添加到这里就可以了。为了便于项目合作,这里应该是相对路径。如下,这里把include也加入进去。
4 测试
完成上述步骤后,在刚刚创建的
test_eigen.cpp
中编写一段代码进行测试:
test_eigen.cpp
#include <iostream>
#include <Eigen\Dense>
using namespace std;
typedef Eigen::Matrix<int, 3, 3> Matrix3i;
int main()
Matrix的初始化方法
Eigen::Matrix<int, 3, 3>
int 代表Matrix的数据类型,3,3 分别代表 rows, cols
Matrix3i m1;
m1(0,0) = 1
m1(0,1) = 2
m1(0,2) = 3
或者用 m1 << 1,2,3 ...
Matrix3i m1;
m1 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
cout << "m1 = \n" << m1 << endl;
Matrix3i m2;
m2 << 1, 0, 0, 0, 1, 0, 0, 0, 1;
cout << "m2 = \n" << m2 << endl;
cout << "m1 * m2 = \n" << (m1 * m2) << endl;
return 0;
运行一下,可以正常输出,表明没有问题。
5 多个项目情况
如果解决方案中存在多个项目A、B、C等,假设eigen源文件在A项目的deps/eigen中,那B、C项目如何配置呢?
这里我们再新建一个项目:右键 解决方案 ,添加-->新建项目,这里选择默认空项目,命名为Project2
创建后如下:
同样,在Project文件夹中也创建src、include等文件夹,但这里我们不创建deps了,我们想使用Project1/deps中的Eigen。
首先,右键Project2-->属性,进入到C/C++标签页下,如果属性页中没有C/C++,那么同样在Project2/src创建一个.cpp文件即可。
然后添加如下内容:
这里
$(ProjectDir)
表示Project2这个文件夹,即当前项目的项目文件夹,如果还有一个Project3,那么这个就是Project3对应的文件夹。
测试
在Project/src中添加一个测试.cpp文件,同时右键Project2,设置为启动项
test_eigen.cpp
#include <iostream>
#include <Eigen\Dense>
using namespace std;
typedef Eigen::Matrix<int, 3, 3> Matrix3i;
int main()
Matrix的初始化方法
Eigen::Matrix<int, 3, 3>
int 代表Matrix的数据类型,3,3 分别代表 rows, cols
Matrix3i m1;
m1(0,0) = 1
m1(0,1) = 2
m1(0,2) = 3
或者用 m1 << 1,2,3 ...
cout << "**********Project2********" << endl;
Matrix3i m1;
m1 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
cout << "m1 = \n" << m1 << endl;
Matrix3i m2;
m2 << 1, 0, 0, 0, 1, 0, 0, 0, 1;
cout << "m2 = \n" << m2 << endl;