Clion调用gurobi的C++接口

0. 系统介绍:

  • 操作系统:win10
  • 开发环境:wsl中安装ubuntu18.04
  • clion版本:2019.1.2
  • 使用的编译器:gcc-4.8和g++-4.8/gcc-7.4和g++-7.4
Clion调用gurobi的C++接口_第1张图片
图0 使用环境

1. 特别提示:

  • CMake的缓存不会被Clion的Build菜单下的clean清空,需要在tools菜单下的CMake中选择Reset Cache and Reload Project,如图一所示。
  • 当使用find_library命令链接到静态库时,如果清空缓存,哪怕是将这个命令删掉,重新同步CMake,这个变量仍然会存在。本人要不是突然发现Message显示的库的版本和指定的版本不同,估计这辈子都无法成功在Clion上调用gurobi。
Clion调用gurobi的C++接口_第2张图片
图一 清空CMake缓存的方法
  • gcc版本选择:如图2所示,gurobi8.1在Ubuntu系统上支持使用GCC4.6和GCC4.8编译器。当使用系统自带的GCC7.4时,需要使用gurobi_g++5.2,默认的静态库指向lgurobi_g++4.2
Clion调用gurobi的C++接口_第3张图片
图二 gurobi支持的linux平台系统以及编译器信息

2.配置Gurobi

  • 下载并解压gurobi,可以放在任意目录下:
wget https://packages.gurobi.com/8.1/gurobi8.1.1_linux64.tar.gz
tar xzvf gurobi8.1.1_linux64.tar.gz 
  • 配置环境变量(如果和我一样在windows下使用wsl开发,以下各步可以省略):
    将以下内容添加到.bashrc或者.zshrc中:
export GUROBI_HOME="/home/swh/gurobi811/linux64"
export PATH="$PATH:$GUROBI_HOME/bin"
if [ $LD_LIBRARY_PATH ]; then
        export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$GUROBI_HOME/lib"
else
        export LD_LIBRARY_PATH="$GUROBI_HOME/lib"
fi
  • 此时使用bash(zsh)或者使用source .bashrc(.zshrc),可使环境配置生效,在任意目录下输入gurobi.sh,可看到如图三所示界面,说明gurobi配置成功。
Clion调用gurobi的C++接口_第4张图片
图三 成功配置的界面
  • 注:在wsl环境下,需要将gurobi.sh中环境变量配置的内容进行删改,否则环境变量会访问一些windows系统中的内容,产生错误,修改如图四所示,将第10行和第11行对环境变量的删除或注释掉。
Clion调用gurobi的C++接口_第5张图片
图四 对gurobi.sh的修改

3. 在Clion中使用gurobi

  • CMake环境变量设置:
    为了方便CMakeLists.txt书写,将gurobi的include文件夹以及lib文件夹的路径以环境变量的形式传入,如图五所示。
    其中LD_LIBRARY_PATH是gurobi的library的路径,如果你将gurobi解压到path,那么这个路径就是path/gurobixxx/linux64/lib;INCLUDE是gurobi库提供的头文件路径,是path/gurobixxx/linux64/include。
Clion调用gurobi的C++接口_第6张图片
图五 CMake环境变量设置
  • 本人的CMakelists.txt如下所示:
  • 首先选择最小的CMake版本、工程名以及工程语言;
  • 其次包含gurobi的INCLUDE路径以及找到gurobi的动态库和静态库。gurobi官方提供了gurobi_g++4.2和gurobi_g++5.2两个静态库以及gurobi81动态库:
    使用gcc-7.4和g++-7.4时,请使用gurobi_g++5.2;
    使用gcc-4.8和g++-4.8时,请使用gurobi_g++4.2。
  • 最后构建可执行程序,本人的main.cpp是gurobi提供的一个示例,并将gurobi的两个库按照静态、动态的顺序给出,因为这个静态库依赖动态库,否则会出现undefined reference的错误。
cmake_minimum_required(VERSION 3.14)
project(testGUROBI)

set(CMAKE_CXX_STANDARD 11)

include_directories($ENV{INCLUDE})
find_library(gurobi_static NAMES gurobi_g++4.2
        PATHS "$ENV{LD_LIBRARY_PATH}")
find_library(gurobi_dynamic NAMES gurobi81
        PATHS "$ENV{LD_LIBRARY_PATH}")
if(NOT gurobi_static)
    message(FATAL_ERROR "Failed to find Gurobi lib")
endif()
message(${gurobi_static})
message(${gurobi_dynamic})

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${gurobi_static} ${gurobi_dynamic})
  • main.cpp源代码如下:
#include "gurobi_c++.h"
using namespace std;

int main() {
    try {
        // Create an environment
        GRBEnv env = GRBEnv(true);
        env.set("LogFile", "mip1.log");
        env.start();

        // Create an empty model
        GRBModel model = GRBModel(env);

        // Create variables
        GRBVar x = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "x");
        GRBVar y = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "y");
        GRBVar z = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "z");

        // Set objective: maximize x+y+2z
        model.setObjective(x+y+2*z, GRB_MAXIMIZE);

        // Add constraint: x+2y+3z <= 4
        model.addConstr(x+2*y+3*z <= 4, "c0");

        // Add constraint: x+y >= 1
        model.addConstr(x+y >= 1, "c1");

        // Optimize model
        model.optimize();

        cout<<"Obj: "<
  • 图六是代码运行结果。
Clion调用gurobi的C++接口_第7张图片
图六 运行结果

4. 本文提到的一些开发环境和工具的配置链接:

  • WSL配置以及使用WSL作为CLion的开发工具链
  • 如何在windows下使用WSL中的工具,例如git,推荐Armin Linzbauer的回答
  • Ubuntu下gcc多版本共存和版本切换
  • 如何清除CLion中的CMake缓存?

你可能感兴趣的:(Clion调用gurobi的C++接口)