标题档抱歉~不一定是最简单的但一定是不会出错的。
如果按照现在大多说教程说的安装方法:先git clone osqp库的源码,然后编译安装。最后再git clone osqp-eigen库的源码,然后编译安装。这种方法大概率会出错。错误要么是找不到osqp相关的.h头文件,要么可能找不到相应的函数libOsqpEigen.so.0.8.1: undefined reference to `osqp_update_upper_bound’。
出错的核心因为osqp-eigen依赖的老版本的osqp库。如果用新版本的osqp库的话,就会有一系列不匹配的问题。所以第一个解决办法是安装老版本的库,osqp-eigen的版本是0.8.1,osqp的版本是0.6.3. 这个方法测试是可行的。但是有没有更简单的解决办法呢?
五步之内必有解药,仔细阅读osqp-eigen的README文件,里面写了最推荐的安装方案:conda一键安装!!!
📦 Install with conda (recommended)
You can easily the library with conda
using the following command
conda install -c conda-forge osqp-eigen
conda
will automatically install osqp
and Eigen3.
安装方法
安装conda
这一步自行搜索,没啥难度也没啥坑。唯一需要注意的anacoda的安装路径是什么,这个路径下面会用到。因为这个安装默认是安装在anncoda目录下的,不是/use/local目录下.
conda安装
conda install -c conda-forge osqp-eigen
使用方法
修改 CMakeLists.txt
添加 OSQP 库的查找和链接
在你的 CMakeLists.txt 文件中,添加对 OSQP 库的查找和链接设置:
cmake_minimum_required(VERSION 3.0.2)
project(my_ros_package)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
# 添加 OSQP 和 OSQP-Eigen 的查找路径,注意这里替换为你自己的conda安装路径!!!
set(OSQP_DIR "/home/dawn/anaconda3/lib/cmake/osqp")
set(OSQP_EIGEN_DIR "/home/dawn/anaconda3/lib/cmake/osqp-eigen")
find_package(osqp REQUIRED)
find_package(osqp-eigen REQUIRED)
include_directories(
${catkin_INCLUDE_DIRS}
${OSQP_INCLUDE_DIRS} # 包含 OSQP 头文件目录
${OSQP_EIGEN_INCLUDE_DIRS} # 包含 OSQP-Eigen 头文件目录
)
add_executable(my_node src/my_node.cpp) #这里替换成你写的文件
target_link_libraries(my_node
${catkin_LIBRARIES}
osqp # 链接 OSQP 库
OsqpEigen::OsqpEigen # 链接 OSQP-Eigen 库
)
然后就可以写代码编译成功啦
PS 知识点1:有些人在链接 OSQP-Eigen 库是使用的是osqp-eigen而不是OsqpEigen::OsqpEigen,为什么也能编译成功?
target_link_libraries
的两种写法在 CMake 中都有效,但它们的语义和使用方式有所不同,具体如下:
1. 不同写法的比较
-
写法一:
target_link_libraries(my_node ${catkin_LIBRARIES} osqp osqp-eigen )
在这个写法中,
osqp
和osqp-eigen
是直接链接的库名。这种方式简单直观,但依赖于库的名称正确无误,并且在某些情况下可能缺乏对库版本的管理。在第一种写法中,osqp 和 osqp-eigen 是库的名称。这意味着你直接指定了要链接的库,而 CMake 需要确保这些库在系统中可用,并且你需要知道它们的具体名称。 -
写法二:
target_link_libraries(my_node ${catkin_LIBRARIES} osqp OsqpEigen::OsqpEigen )
这里使用了 OsqpEigen::OsqpEigen
作为链接库,表明 OsqpEigen
是通过 CMake 的目标名称(target name)导入的。这种方式提供了更多的封装和安全性,因为 CMake 会处理库的依赖关系和版本问题。在第二种写法中,OsqpEigen::OsqpEigen 是一个目标名称。目标名称是由库的 CMake 配置文件定义的,通常这种写法表明库具有一些额外的属性,比如版本、依赖关系等。
通过目标名称,你可以享受到 CMake 提供的封装优势。比如,OsqpEigen::OsqpEigen 是在 CMake 配置文件中定义的,CMake 知道这个目标的所有信息,包括其依赖项和版本。如果 osqp-eigen 的维护者更新了库,只需更新 CMake 配置,用户的代码无需修改。
2. 哪种写法更好?
推荐使用目标名称(target name)方式(即第二种写法)。原因包括:
- 更好的封装性:使用目标名称可以确保 CMake 处理的依赖关系和版本信息,避免手动管理库路径。
- 便于重用和模块化:如果库被更新或重构,使用目标名称可以减少对代码的影响,因为只需更新 CMake 配置,而不必逐个修改链接命令。
- 兼容性和可移植性:使用目标名称更具可移植性,适应性强,不受平台和构建系统变化的影响。
3. 使用建议
在你的项目中,尽量使用库的目标名称进行链接,特别是当库支持通过 CMake 提供目标名称时。你可以在 CMake 的官方文档或库的文档中找到目标名称,以确保正确链接。
总体来说,第二种写法更具可维护性和安全性,因此建议使用它来链接依赖库。