XCode上C++库的使用(Eigen、Sophus、Pinocchio、Boost)

平台信息:(MacBook Pro、Apple M1 Pro、Sequoia 15.1)

XCode Version 16.1

参考工程:/Users/liuhaitao/lht_Xcode/Learn_Eigen_Sophus_Pinocchio_boost

1、XCode与brew介绍

1.1、brew介绍

homebrew是一个开源的包管理器,一般主要用于mac上。homebrew官网(打开如下图所示);brew github。利用brew工具可以下载库。

image-20241117093402170

# brew常用的几个命令

brew --version # 查看brew版本。

brew list # 查看brew所安装的libraries。

brew install <package_name> #安装

brew info <package_name> # 查看package信息。

brew --prefix <package_name> # 查看库的地址。

大多数软件包会提供预编译的二进制文件(bottle)。brew一般就是安装的是编译好的版本。利用brew info <package_name>查看。

image-20241115150116085

和conda、pip等区别

conda主要是环境管理和包管理,主要是python语言,也支持其他语言(但我用的不多)

pip是python官方的包管理工具。专门用于安装 Python 包(从 PyPI 仓库中获取)。

1.2、brew安装位置

对心新手,可能比较好奇:利用brew安装的库,到底安装哪里去了呢?

注意:Mac上磁盘默认情况下,只有这四个文件

image-20241118101129606

需要显示隐藏文件(shift cmd .),找到opt

image-20241118101221521

/opt/homebrew/Cellar文件夹下就可以找到下载的库。比如后面介绍eigensophuspinocchio

image-20241118102150563

使用这个brew --prefix pinocchiobrew --prefix eigen命令可以查询库的地址。

/opt/homebrew/opt/pinocchio
/opt/homebrew/opt/eigen

/opt/homebrew/opt/xxx 是一个快捷方式(symlink),指向 xxx 的实际安装目录。

/opt/homebrew/Cellar/xxx 是库的实际安装路径,即最终真实路径为:

/opt/homebrew/Cellar/eigen
/opt/homebrew/Cellar/pinocchio

1.3、XCode介绍

1.3.1、Xcode入门(Command Line Tool)

基于:

Xcode苹果公司向开发人员提供的集成开发环境,用于开发macOSiOSiPadOSwatchOStvOSvisionOS的应用程序。

打开Xcode软件$\to$Create New Project,会看到如下界面。

对于我们来说,就用到命令行工具,调C++库,写代码就可以

Create New Project…$\to$ macOS$\to$Command Line Tool)

image-20241119141748882

1.3.2、引用C++库

按照1.3.1建立的工程,会有一个main.cpp的文件,有一个示例程序,可以用标准c++的库函数,比如iostream、fstream、sstream等等。

但是涉及特定的C++程序,就可以自己下载,调用了。

  • 1、包含头文件(有的C++库只由头文件组成,那么只需要这一步就可以了,比如EigenSophus等)

image-20240611110704659

对于只有头文件的库,将下载好的库直接拖到了/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/中也是可以的。eigen库的安装进行了举例,参考

  • 2、包含lib库

image-20240611110745291

  • 3.1、Other Linker Flags(下面这个图,在搞清楚一下,在修改一下)

    image-20240611110824157

  • 3.2、跟3.1的目的类似,但是好像也不管用。

    image-20241024183825174

2、Eigen、Sophus库的安装与使用

eigen

方法1(不是brew)

Eigen是一个纯头文件构建的库,没有.cpp,也没有.lib,直接include就可以

在mac上,直接下载、解压,得到eigen-3.4.0。将这个文件夹中的Eigen文件夹

image-20240609213305297

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/中,就可以直接使用了。

image-20240609213538416

在XCode中就可以愉快使用了(不需要进行其他的链接等配置)

方法2(brew)

利用brew install eigen方法安装。

Header Search Paths中添加路径/opt/homebrew/Cellar/eigen/3.4.0_1/include/eigen3即可

注意:并且在PROJECTTARGETS中都有Header Search Paths,一般是TARGETS中添加路径。

image-20241118100228341

sophus(brew)

这个库也是只有头文件的

直接利用brew安装:brew install sophus

也是安装在了/opt/homebrew/Cellar/sophus中。

image-20241115145605895

和基于brew方法安装eigen的操作相同,在头文件中包含就可以了。

3、pinocchio库(C++版)(brew)

参考这个,在Mac利用brew上安装、直接运行的下图的两行代码

image-20241025101337324

pinocchio库需要依赖boost库。但是boost库在xcode上感觉有问题一直不成功。

基本把全网的方法都尝试了就是不行???2024.11.18。

==(终于解决啦2024.11.18)在header search paths和library search paths包含include和lib的时候,不要选择recersive模式,直接就non-recursive模式就可以了,太tm无语了,也不知道为啥!!!==

4、demo

完成上述配置,就可以愉快的写代码了,测试代码如下:

#include <iostream>
#include <ctime>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <Eigen/Dense>
#include <pinocchio/multibody/sample-models.hpp>
#include "pinocchio/algorithm/joint-configuration.hpp"
#include "pinocchio/algorithm/rnea.hpp"
#include <sophus/se3.hpp>


int main(int argc, const char * argv[]) {
    // 计算程序运行时间
    clock_t start,finish;
    start=clock();
    
    
    // 测试一下Eigen库
    Eigen::MatrixXd m(2,2);
    m(0,0) = 3;
    m(1,0) = 2.5;
    m(0,1) = -1;
    m(1,1) = m(1,0) + m(0,1);
    std::cout << m << std::endl;
    
    
    // 测试一下sophus库
    // 沿着Z轴旋转90度的旋转矩阵
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI / 2, Eigen::Vector3d(0, 0, 1)).toRotationMatrix();
    Eigen::Quaterniond q_(R);
    Sophus::SO3d SO3_R(R);
    Sophus::SO3d SO3_q(q_);
    std::cout << "SO(3) from matrix:\n" << SO3_R.matrix() << std::endl;
    std::cout << "SO(3) from quaternion:\n" << SO3_q.matrix() << std::endl;
    std::cout << "they are equal" << std::endl;
    
    
    // 测试一下pinocchio库
    // 参考:https://gepettoweb.laas.fr/doc/stack-of-tasks/pinocchio/master/doxygen-html/
    pinocchio::Model model;
    pinocchio::buildModels::manipulator(model);
    pinocchio::Data data(model);
    Eigen::VectorXd q = pinocchio::neutral(model);
    Eigen::VectorXd v = Eigen::VectorXd::Zero(model.nv);
    Eigen::VectorXd a = Eigen::VectorXd::Zero(model.nv);
    const Eigen::VectorXd & tau = pinocchio::rnea(model, data, q, v, a);
    std::cout << "tau = " << tau.transpose() << std::endl;
    
    
    finish=clock();
    std::cout << finish-start   << "/" << CLOCKS_PER_SEC  << " (s) "<< std::endl;
    
    return 0;
}

运行结果

image-20241120220241688

backgroud

Xnip2024-11-20_22-20-01