VS Code构建C++ cmake工程

VSC构建cmake工程

1.文件准备

1-1
在准备用vs code打开的文件夹下:
新建文件:CMakeLists.txt
内容:

cmake_minimum_required(VERSION 2.8)
project(useEigen)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")

# 添加Eigen头文件
include_directories("/usr/include/eigen3")
add_executable(test test.cpp)

注意这里测试eigen库的使用,可执行文件为cpp

1-2
创建test.cpp主程序
见附录(这里贴上导入头文件部分)

#include <iostream>

using namespace std;

#include <ctime>
// Eigen 核心部分
#include <eigen3/Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <eigen3/Eigen/Dense>

using namespace Eigen;

2. 进行调试

2-1 在vs code中打开项目文件夹,这里叫做useeigen
在这里插入图片描述
2-2 点击左侧小蜘蛛,然后点击——创建launch文件(忘记截图)
在这里插入图片描述
3-3 这个时候资源管理器下就会生成.vscode文件夹,下面有个launch.json文件,将内容改为如下

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/test",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

也就是说,你可以直接复制我贴出来的这段程序,然后"program": "${workspaceFolder}/build/test"这里改成你自己的,但是注意,一定要有build,这个是vs code帮你自动创建的,然后test的可执行程序也是vs code在build下帮你创建的,这里之所以要写test是因为你的CMakeList.txt中可执行程序叫做test:

add_executable(test test.cpp)

其他地方无需修改。
(总结:根据CMakeLists.txt文件内容,将会在build文件夹下生成test可执行文件)

3-3 然后点击界面最下方的build, 选择GCC5.4… ,开始build…然后就在build问价夹下生成了result可执行文件,有了可执行文件才能进行debug操作。(底部蓝色那里)
在这里插入图片描述
3-4 点击F5进行调试,当然了,可以在左侧双击设置断点。
在这里插入图片描述
输出成功。

4.补充

以后若想还在这个文件夹下运行其他cpp执行文件,那么除了在CmakeList.txt中加一下可执行文件,再需要在launch,json文件中改一下build后面的可执行程序名称即可

附录

#include <iostream>

using namespace std;

#include <ctime>
// Eigen 核心部分
#include <eigen3/Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <eigen3/Eigen/Dense>

using namespace Eigen;

#define MATRIX_SIZE 50t

int main(int argc, char** argv)
{
  
//   // 声明2*3的矩阵
  Matrix<float, 2, 3> matrix_23;
  
  Vector3d v_3d;
  
  Matrix<float, 3, 1> vd_3d;
  
  Matrix3d matrix33 = Matrix3d::Zero();  // 初始化为0
  
  cout<<matrix33<<endl;
  
  // 矩阵赋值,可以按照顺序赋值,也可以直接索引进行赋值
  
  matrix_23<<1,2,3,4,5,6;
  cout<<"matrix_23: \n"<<matrix_23<<endl;
  
  matrix_23(0,1) = 100;
  cout<<"after_matrix_23: \n"<<matrix_23<<endl;

  // 打印向量
  for(int i=0;i<2;i++)
  {
    for(int j=0;j<3;j++)
    {
      cout<<matrix_23(i,j)<<"\t";
    }
    cout<<endl;
  }
  
  // 矩阵和向量相乘
  v_3d << 3,2,1;
  vd_3d<<4,5,6;
  
  Matrix<double, Dynamic, Dynamic> result = matrix_23.cast<double>() * v_3d;  // 注意想乘必须类型相同
  cout<<"[1,2,3;4,5,6]*[3,2,1] = \n"<<result.transpose()<<endl;  // transpose表示转置
  
  MatrixXd result2 = matrix_23.cast<double>() * v_3d;
  cout<<"result2:\n"<<result2<<endl;  // 可以用MatrixXd定义毫不知情的时候的矩阵,用来接计算结果
//   cout<<matrix_23.cast<double>() * v_3d<<endl;  // 直接这样也是可以的
  
  // 矩阵与矩阵相乘直接用乘法(注意维度匹配)
  cout<<matrix_23.transpose()*matrix_23<<endl;
  
  // 随机数矩阵
  srand( (unsigned int )time(NULL) );
  matrix33 = Matrix3d::Random();
  cout<<"random矩阵:\n"<<matrix33<<endl;
  
  // 转置
  cout<<"random矩阵的转置:\n"<<matrix33.transpose()<<endl;
  
  // 各个元素和
  cout<<"sum:\n"<<matrix_23.sum()<<endl;
  
  // 矩阵的迹(主对角线元素的和)
  cout<<"迹:\n"<<matrix33.trace()<<endl;
  
  // 逆
  cout<<"逆:\n"<<matrix33.inverse()<<endl;
  
  // 计算行列式
  cout<<"计算行列式结果:\n"<<matrix33.determinant()<<endl;

  // 计算特征值,特征向量
  SelfAdjointEigenSolver<Matrix3d> es(matrix33);
  cout<<"矩阵的特征值:\n"<<es.eigenvalues()<<endl;
  cout<<"矩阵的特征向量:\n"<<es.eigenvectors()<<endl;
  
  // 解方程 Ax = b类,可以直接求逆然后算,但是计算量大
  Matrix<double, MATRIX_SIZE,MATRIX_SIZE> matrix_NN = MatrixXd::Random(MATRIX_SIZE,MATRIX_SIZE);
  matrix_NN = matrix_NN*matrix_NN.transpose();  // 保证半正定
  Matrix<double, MATRIX_SIZE, 1> v_Nd = MatrixXd::Random(MATRIX_SIZE,1);
  
  clock_t time_stt = clock(); 
  // 求逆的方法 4ms
  Matrix<double, MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd;
  cout << "time of normal inverse is "
       << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
  cout << "x = " << x.transpose() << endl;
  
  // 通常用矩阵分解来求解,例如QR分解,速度快很多 0.112ms
  time_stt = clock(); 
  x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
  cout << "time of normal inverse is "
       << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
  cout << "x = " << x.transpose() << endl;
  
  // 对于正定矩阵,还可以用cholesky分解 0.03ms
  time_stt = clock(); 
  x = matrix_NN.ldlt().solve(v_Nd);
  cout << "time of normal inverse is "
       << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
  cout << "x = " << x.transpose() << endl;
  
  return 0;
  
}

发布了103 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44684139/article/details/104744896