Windows下Eigen、osqp和osqp-eigen库的安装使用

  • 项目 EM Planner 中需要使用到 Eigen,osqp以及osqp-eigen库,这里介绍如何在 windows 下编译安装这些基本库的方法;
  • 这里只进行依赖库安装说明,需要项目还是在 linux 下开发,环境配置会简单很多。

1. Eigen 库编译安装与使用

1.1 编译安装 Eigen

  • Eigen3 官网
  • Eigen 可以不用编译成库,因为其所有文件都是 .hpp 头文件形式,没有库文件,可以直接放在自己工程文件中使用,只要在 CMakeLists.txt 的 include_directories() 中放入Eigen目录即可。但最好还是将 Eigen 编译成库文件使用,编译安装方法见这里,可以自定义安装目录,最后使用 find_package(Eigen3 REQUIRED) 就可以找到对应的 .make 文件,比较神奇,因为按理来说需要指定安装的目录来查找对应的文件。

1.2 使用 Eigen

这里是直接将 Eigen 编译安装了,CMakeLists.txt 文档可写成如下形式:

cmake_minimum_required(VERSION 3.20)  
project(smoothFrenet)

find_package(Eigen3 REQUIRED)
add_executable(main main)  
  
target_link_libraries(main Eigen3::Eigen)

2. osqp 库编译安装与使用

2.1 编译安装 osqp

  • osqp官网
  • osqp 库的安装与 Eigen 类似,安装方法同样参考这里。因为直接安装到系统目录需要管理员权限,并且每次使用都要赋予权限,比较麻烦,所以还是将其安装到自定义的文件夹内。

2.2 使用 osqp

主要介绍 CMakeLists.txt 文档的编写:

cmake_minimum_required(VERSION 3.20)  
project(test)  
set(CMAKE_CXX_STANDARD 14)

# 指定 osqp 安装目录,不然找不到对应的cmake文件
find_package(osqp REQUIRED  
             PATHS D:/cppThirdParty/libInstall/osqpLib              
              NO_DEFAULT_PATH)
              
add_executable(test main.cpp)  

#使用静态库 osqp::osqpstatic,对应的是 .a 文件,而不要使用 osqp::osqp
target_link_libraries(test osqp::osqpstatic)

注意点:

  1. find_package() 时指定路径;
  2. 使用静态库 osqp::osqptatic

3. osqp-eigen 库的编译安装与使用

osqp 主要是用 c 语言完成,关于矩阵的表示与运算比较底层,所以使用起来很不方便。因此使用在 osqp 基础上开发的 osqp-eigen 库会方便很多。其依赖于 osqp 和 Eigen,按照上面的常规步骤进行编译可以成功,但在使用时会找不到库文件,问题可以出在这两个地方:

  1. 因为 osqp 库是安装在自定义目录,所以 osqp-eigen 没有找到要使用的库文件。 这里我已经将 osqp-eigen 的相关 .cmake 文件进行了更改,并且最后编译也通过了,所以问题出在这里的可能性比较小,但由于无法排查,所以在这里也记录一下。
  2. 编译该库没有生成 .a 文件,只生成了 libOsqpEigen.dll.alibOsqpEigen.dll 两种库文件。而按照之前在 cmake 中使用的情况,貌似即使是在 windows 内,也是需要使用 .a 的库文件,所以怀疑问题出在这里。

由于始终无法正常使用,所以准备自己将这个库编译一下。

3.1 编译 osqp-eigen 库

主要使用 cmake 中 add_library() 完成静态库编译,下面是详细的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.20)
project(osqp_eigen)
include_directories(./include)

# 将 ./src 下面的全部.cpp 文件放到变量 DIR_LIB_SRCS 中
aux_source_directory(./src DIR_LIB_SRCS)

find_package(Eigen3 REQUIRED)

find_package(osqp REQUIRED
        PATHS D:/cppThirdParty/libInstall/osqpLib
        NO_DEFAULT_PATH)

# 生成静态库
add_library(osqp_eigen STATIC ${DIR_LIB_SRCS})
# 链接需要使用的外部库
target_link_libraries(osqp_eigen Eigen3::Eigen osqp::osqpstatic)

# 安装生成的静态库文件osqp_eigen 至<CMAKE_INSTALL_PREFIX>/lib中,ARCHIVE 代表静态库
install(TARGETS osqp_eigen ARCHIVE DESTINATION lib)

# 将整个 ./include下面的文件夹安装至 <CMAKE_INSTALL_PREFIX>/include中,这里是头文件
install(DIRECTORY ./include/ DESTINATION include)

message(STATUS ${DIR_LIB_SRCS}"--构建库完成")

然后按照常规编译安装步骤就可以将头文件和库文件安装到设定位置了。

3.2 使用 osqp-eigen 库

这里因为没有写相关的 .cmake 配置文件,所以就无法使用相关的 find_package() 来自动寻找库文件了,所以手动配置一下,后续再考虑自动查找的设置。

cmake_minimum_required(VERSION 3.20)  
project(osqp_eigen)  
set(CMAKE_CXX_STANDARD 14)  

# 这里在 <CMAKE_PREFIX_PATH> 中添加了osqp安装库的位置,所以下面的 find_package()就不用再重新设置路径了
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} “D:/cppThirdParty/libInstall/osqpLib”) 
set(OSQPEIGEN_INCLUDE_DIR D:/cppThirdParty/libInstall/osqpEigenLib/include)  
set(OSQPEIGEN_LIB_DIR D:/cppThirdParty/libInstall/osqpEigenLib/lib)  

 
find_package(Eigen3 REQUIRED)  
find_package(osqp REQUIRED)  
  
include_directories(${OSQPEIGEN_INCLUDE_DIR})  
link_directories(${OSQPEIGEN_LIB_DIR})  
  
add_executable(main main.cpp)  
target_link_libraries(main libosqp_eigen.a Eigen3::Eigen osqp::osqpstatic)

4. 使用例子