本文仅作个人记录用,之前未接触过C++,也没有使用过clion和cmake,不喜勿喷。
首先下载clion,mingw并配置相关环境,安装cmake,这部分比较简单,没有遇到什么问题。
接下来新建一个项目,发现Clion已经自动生成了CMakeLists.txt。
在eigen官网下载最新版本的压缩包,window系统下直接下载zip包即可。
光下载下来压缩包直接引用肯定是行不通的,要通过CMakeLists.txt来帮助我们的项目和eigen库联系起来。
想要引入eigen库有两种方法,下面先说最简单的一种。
不写find_package
直接把压缩包解压到某个文件夹,比如我直接解压到c盘目录下。
直接在CMakeLists.txt添加如下的语句即可
include_directories(C:\\eigen-3.4.0)
括号内填自己解压的路径,如果不想写两个\\的话可以换成/
include_directories(C:/eigen-3.4.0)
试着在cpp中include Eigen并使用
#include <Eigen/Dense>
如果可以编译没有报错,说明已经成功了,写一个小Demo测试一下即可。有的时候,Clion可以正常编译运行,但是编辑界面还是爆红提示文件没有找到。
这种情况点一下上方工具栏的File->Reload CMake Project,一般来说就正常了,暂时没想到别的解决办法......
写find_package的方法
这种方式相对就比较繁琐一点了。Eigen这个库其实是可以安装的,打开解压后的文件夹会发现其中有个install文件。
使用记事本打开该文件,其中重点内容如下
Method 2. Installing using CMake
********************************
Let's call this directory 'source_dir' (where this INSTALL file is).
Before starting, create another directory which we will call 'build_dir'.
Do:
cd build_dir
cmake source_dir
make install
The "make install" step may require administrator privileges.
因为cmake有图形化工具,前两步我就不用命令行了。
先在解压的文件夹下新建一个文件夹(其实位置和名字无关紧要)
管理员权限打开图形化工具
在这之后管理员权限打开命令行窗口(cmd),cd 到新建的文件夹下。
执行 如下命令
make install
需要注意的是,我的window 11 默认是没有make的,需要先下载安装再使用这个命令,安装的方式有很多种,我这里使用的是这种方式,如果发现下载不了可能要注意上网方式的科学性,或者用其他替代方案。
安装完成之后,注意上面图形化界面那张图的安装地址,可以去检查一下是否出现了对应的文件夹。接下来我们看看Eigen官网是怎么建议我们在cmake项目中使用eigen的:官网
如果你前面的步骤都是按照这篇文章走的,那么后面的部分其实不用看,重点在于CMakeLists.txt的内容怎么调整,这是官网给出的样例:
cmake_minimum_required (VERSION 3.0)
project (myproject)
find_package (Eigen3 3.3 REQUIRED NO_MODULE)
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)
其中第1,2,4行都是Clion新建项目时就自动生成的,我们重点要关注的就是3,5行,注意把example换成你自己的项目名称(也就是project里面填的),NO_MODULE和版本填不填都不影响结果。Eigen是怎么解释这段内容的呢?
Eigen exports a CMake target called
Eigen3::Eigen
which can be imported using thefind_package
CMake command and used by callingtarget_link_libraries
as in the following example
那么现在唯一的问题就是,find_package到底是怎么知道Eigen安装的路径的?通过查看CMAKE官网对于find_package命令的文档说明,在Config Mode Search Procedu这一栏中,可以看到第7点的解释
7.Search cmake variables defined in the Platform files for the current system. This can be skipped if
NO_CMAKE_SYSTEM_PATH
is passed or by setting the CMAKE_FIND_USE_CMAKE_SYSTEM_PATH toFALSE
:The platform paths that these variables contain are locations that typically include installed software. An example being
/usr/local
for UNIX based platforms.
也就是说,根据平台的不同,find_package会默认地去查找一些固定的路径。知道这一点之后,再打开上文中对于CMAKE_SYSTEM_PREFIX_PATH的介绍,一切就很清楚了。
这就是为什么很多教程里面写的是/usr/local,因为默认的环境是不一样的。比如这个教程,但是它似乎是第一第二种方法的混合,实际上即便按照这个教程把里面find_package的部分去掉,还是能够成功引入eigen的,因为它实际上使用的是第一种方法。下面给出一个完整可行的txt例子,注意大小写是要区分的:
cmake_minimum_required(VERSION 3.19)
project(graph0)
set(CMAKE_CXX_STANDARD 20)
find_package(Eigen3 REQUIRED )
add_executable(graph0 main.cpp )
target_link_libraries (graph0 Eigen3::Eigen)
写一个小demo测试一下能不能成功使用
#include <iostream>
#include <Eigen/Core>
int main() {
const double QUARTER_PI = 45.0 * M_PI / 180.0;
const double HALF_PI = 90.0 * M_PI / 180.0;
Eigen::Vector<double, 3> point(2, 1, 1);
Eigen::Matrix3d matrix45;
Eigen::Matrix3d matrix90;
matrix45 << cos(QUARTER_PI), -sin(QUARTER_PI), 1,
sin(QUARTER_PI), cos(QUARTER_PI), 2,
0, 0, 1;
matrix90 << cos(HALF_PI), -sin(HALF_PI), 0,
sin(HALF_PI), cos(HALF_PI), 0,
0, 0, 1;
std::cout << "(" << point.x() << "," << point.y() << "," << point.z() << ")" << std::endl;
point = matrix45 * point;
std::cout << "(" << point.x() << "," << point.y() << "," << point.z() << ")" << std::endl;
return 0;
}
输出结果看起来没有问题~
一切顺利。