无法在 7.5.1 版中编译 Gurobi 示例

Dav*_* M. 8 c++ gurobi

我刚刚在 Linux (Ubuntu) 上将 Gurobi 更新到了 7.5.1 版——这是可用的最新版本。

问题每当我尝试编译任何使用 Gurobi 的代码时——例如,包含在 中的示例/opt/gurobi751/linux64/examples,我都会得到一串未定义的引用错误(例如 undefined reference to GRBModel::set(...))。如果我可以转到目录/opt/gurobi751/linux64/examples/build并运行命令make run_diet_c++并编译并运行它,我会考虑解决问题。

尝试修复

(1) 我已经$GUROBI_HOME在我的.bashrc文件中设置了——它指向正确的目录。$LD_LIBRARY_PATH并且$PATH也已更新。它们都指向正确的目录。

(2) 我有一个有效的 Gurobi 许可证。如果我编写一个.lp文件并像 一样运行它gurobi_cl model.lp,它就会正确运行。运行gurobi_cl --version给出了预期的输出(版本 7.5.1)。

(3) 如果我尝试编译 C 版本(使用make run_diet_c),一切都会按预期进行。

更多信息

我在我的主目录中创建了以下测试文件:

#include <stdio.h>
#include "gurobi_c++.h"

int main(int argc, char **argv)
{
    GRBVar x;
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我使用 g++ 和以下命令进行编译:

g++ -Wall test.cpp -o executable -I/opt/gurobi751/linux64/include -L/opt/gurobi751/linux64/lib -lgurobi_c++ -lgurobi75
Run Code Online (Sandbox Code Playgroud)

这将编译并运行而不会抱怨。但是,我尝试了这个例子:

#include <stdio.h>
#include "gurobi_c++.h"

int main(int argc, char **argv)
{
    GRBEnv* env = 0;
    try {
        env = new GRBEnv();
        GRBModel model = GRBModel(*env);
        model.addVar(0, 1.0, 1.0, GRB_CONTINUOUS, "TheVar");
        model.update();
        model.optimize();
    } catch (...) {
        std::cout << "Exception during optimization" << std::endl;
    }

    delete env;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并使用相同的命令编译它,但失败了。所以看起来 include 语句工作正常,但不知何故它没有正确链接到库?

如果需要更多信息,请告诉我。另外,如果不是很清楚,我对编译和链接过程不是很了解,这可能会阻碍我在这里。

Gri*_*tto 8

您需要为您的 g++ 版本编译 libgurobi_c++。

首先,进入文件夹

cd /opt/gurobi751/linux64/src/build/

make
Run Code Online (Sandbox Code Playgroud)

现在,您需要将编译后的文件复制到 lib 文件夹:

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

您将编译并运行。

  • 在最新版本的 gurobi(版本 8)中,“libgurobi_c++.a”是一个符号链接。上述解决方案用实际文件覆盖此符号链接。我建议改为执行以下操作:`cd /opt/gurobi751/linux64/src/build/`、`make`,获取 g++ 的版本:`g++ --version`。假设您的 g++ 版本是 7.4。将 `libgurobi_c++.a` 重命名并移动到 `../../libgurobi_g++7.4.a`:`mv libgurobi_c++.a ../../libgurobi_g++7.4.a`。`cd ../../lib/`。最后,重定向符号链接:“ln -sf ./libgurobi_g++7.4.a libgurobi_c++.a”。 (2认同)