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官网论坛的教程。为了避免本文存在任何引诱国内读者产生违法上网行为的嫌疑,对于如何访问该论坛不作说明。