Ubuntu安装Gurobi+CMake使用详细指南

关键词:

Ubuntu, Gurobi, Cmake, CmakeLists

1 环境

  • Ubuntu 20.04
  • Gurobi 10.01

2 安装Gurobi

2.1 下载Gurobi

下载地址:gurobi下载地址

这个一定要看:gurobi官方教程

截至今天(2023.6.1)最新版本是10.01,下载文件:gurobi10.0.1_linux64.tar.gz

2.2 解压

根据安装指导的说法,建议安装在/opt/目录下。所以需要把你下载下来的文件解压后复制到/opt、目录下

tar xvfz gurobi10.0.1_linux64.tar.gz
sudo cp -r gurobi10.0.1_linux64/gurobi1001/ /opt/

这时,你在/opt/gurobi1001/linux64/目录下就可以看到你解压的文件了

 2.4 取得授权

使用高校邮箱和校园网IP可以获得Academic版本授权。

这里申请授权码,如果你准备在单机上使用,建议你申请Named-User Academic类型,这样只需要每年认证一次即可。

 授权后你会得到一串字符:形如 grbgetkey XXXXXX XXXXXX XXXXXX,复制这一串内容。

回到终端,输入你的授权码:

grbgetkey XXXXXX XXXXXX XXXXXX

 这时会连接授权服务器,核验你的校园网IP,核验通过后,会让你选择授权文件的安装位置。一般默认安装在/home下即可。

当然你也可以把授权文件放在你的安装目录/bin下:

cd /opt/gurob1001/linux64/bin/
sudo chmod +777 grbgetkey
grbgetkey XXXXXX XXXXXX XXXXXX

不管放在哪里,你都需要记住这个位置,后面会用到。

注意:

  • 打开 gurobi.lic 文件,显示许可过期日期( EXPIRATION=),以及支持的最大版本号( VERSION=)。许可文件不能编辑。 许可到期后, 重新申请获得新激活码, 产生新的 gurobi.lic 许可文件替换掉旧许可文件
  • 授权码一旦激活,就和机器捆绑,无法转移、无法注销。更换机器、重装系统、更换用户账号都需要申请新授权码。授权码、授权文件、与你的电脑主板唯一对应。如果更换了电脑主板,即使是同一块硬盘,原有的授权也不能使用。需要重新申请,此时继续使用原有授权文件会报错如下:
  •  即使连接校园网有时候也不一定可行,有的校园网IP无法被认证为教育IP。以上海交通大学校园网为例:直连SJTU时,会报错:

error : ERROR 305: Ip: 58.XX.XXX.XXX  is not a recognized academic address. For China, Hong Kong or Macau, please visit gurobi.com/aca_china for manual instructions. 无法自动识别为教育机构地址如果你居住在中国(包括香港和澳门),请浏览 gurobi.com/aca_china 网页申请免IP验证许可

实测,连接校园网VPN可以通过验证。

  • 至于Linux系统连接VPN的一些问题,就不在此文章讨论范围内了……

2.5 设置环境变量

打开.bashrc文件:

sudo gedit ~/.bashrc

在文件末尾插入如下内容,保存:

# varibles for GUROBI optimization
export GUROBI_HOME="/opt/gurobi1001/linux64"
export PATH="${PATH}:${GUROBI_HOME}/bin"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib"
export GRB_LICENSE_FILE=/你自己的文件位置/gurobi.lic

3 在CMake下使用

3.1 准备链接库

Gurobi安装目录下的src文件夹里编译、生成链接库:

cd /opt/gurobi1001/linux64/src/build/
sudo make

可以得到 libgurobi_c++.a 静态链接库,你需要把它移动到/lib/目录下:

sudo cp libgurobi_c++.a ../../lib/

3.2 配置CMake文件

此处参考博客:Ubuntu Gurobi C++ 编译教程 +CMakeLists配置

首先我们写一段使用到Gurobi库的代码,这里我们直接从安装目录/example/c++/下找一个,mip.cpp,放在我们的功能包下。

在你的功能包的cmakelists.txt目录下,建立FindGUROBI.cmake文件。文件内容:

if (NOT GUROBI_FOUND)
    # 硬编码查找头文件和链接库
    set(SEARCH_PATHS_FOR_HEADERS
        "$ENV{GUROBI_HOME}/include"
    )
    set(SEARCH_PATHS_FOR_LIBRARIES
        "$ENV{GUROBI_HOME}/lib"
    )
    find_path(GUROBI_INCLUDE_DIR gurobi_c++.h
      PATHS ${SEARCH_PATHS_FOR_HEADERS}
    )
    find_library( GUROBI_C_LIBRARY
                  NAMES libgurobi100.so
                  PATHS ${SEARCH_PATHS_FOR_LIBRARIES}
                  )

    find_library( GUROBI_CXX_LIBRARY_DEBUG
                NAMES libgurobi_c++.a
                PATHS ${SEARCH_PATHS_FOR_LIBRARIES}
                )

    find_library( GUROBI_CXX_LIBRARY_RELEASE
                NAMES libgurobi_c++.a
                PATHS ${SEARCH_PATHS_FOR_LIBRARIES}
                )

    # setup header file directories
    set(GUROBI_INCLUDE_DIRS ${GUROBI_INCLUDE_DIR})

    # setup libraries files
    set(GUROBI_LIBRARIES
            debug ${GUROBI_CXX_LIBRARY_DEBUG}
            optimized ${GUROBI_CXX_LIBRARY_RELEASE}
            ${GUROBI_C_LIBRARY}
            )

endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GUROBI DEFAULT_MSG GUROBI_INCLUDE_DIRS)
find_package_handle_standard_args(GUROBI DEFAULT_MSG GUROBI_LIBRARIES)

mark_as_advanced(GUROBI_LIBRARIES GUROBI_INCLUDE_DIRS GUROBI_INCLUDE_DIR)

需要注意:在官方教程的C++部分,提出应当至少包含两个链接库:

  • C的动态链接库:libgurobi_c++.a
  • C++的静态链接库:libgurobi100.so

所以上面的CMake文件里需要用find_library()找到这两个链接库。

这里链接库的位置和名字一定要和安装目录bin下的库名字一致,如果出现如下的报错多半是因为没有找到库,需要再次核对你写的库名字和bashrc下的变量:

 3.3 配置CMakeLists.txt

在你的CMakeLists.txt里添加如下内容:

#下面引入你刚才写的CMake文件
include(./FindGUROBI.cmake)
include_directories(${GUROBI_INCLUDE_DIRS})

#下面将你的代码链接到动态链接库
#把mip替换为你的代码的名字
ADD_EXECUTABLE(mip mip.cpp)
TARGET_LINK_LIBRARIES(mip ${catkin_LIBRARIES} ${GUROBI_LIBRARIES})

4 运行测试

回到工作空间根目录,编译,运行:

catkin_make
roscore
rosrun mip mip

正常运行,完成!

另:

我在找资料的时候又看到另一个用CMake工具编译包含Gurobi的C++代码的教程,也提供了C++文件和CmakeLists.txt。是gurobi官网论坛的教程。为了避免本文存在任何引诱国内读者产生违法上网行为的嫌疑,对于如何访问该论坛不作说明。