Я пытаюсь решить довольно простой IP с помощью gurobi, запуская его из c ++ (источник: http://rmlewi.people.wm.edu/~rmlewi/sciclone/docs/gurobi/quickstart/node5.html):
#include <iostream>
#include "gurobi_c++.h"
using namespace std;
int main(int argc,
char *argv[])
{
try {
GRBEnv env = GRBEnv();
GRBModel model = GRBModel(env);
// Create variables
GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB_BINARY, "x");
GRBVar y = model.addVar(0.0, 1.0, -1.0, GRB_BINARY, "y");
GRBVar z = model.addVar(0.0, 1.0, -2.0, GRB_BINARY, "z");
// Integrate new variables
model.update();
// Add constraint: x + 2 y + 3 z <= 4
GRBLinExpr expression;
expression += x;
expression += 2*y;
expression += 3*z;
model.addConstr(expression <= 4, "c0");
// Add constraint: x + y >= 1
model.addConstr(x + y >= 1, "c1");
// Optimize model
model.optimize();
cout << x.get(GRB_StringAttr_VarName) << " "<< x.get(GRB_DoubleAttr_X) << endl;
cout << y.get(GRB_StringAttr_VarName) << " "<< y.get(GRB_DoubleAttr_X) << endl;
cout << z.get(GRB_StringAttr_VarName) << " "<< z.get(GRB_DoubleAttr_X) << endl;
cout << "Obj: " << model.get(GRB_DoubleAttr_ObjVal) << endl;
} catch(GRBException e) {
cout << "Error code = " << e.getErrorCode() << endl;
cout << e.getMessage() << endl;
} catch(...) {
cout << "Exception during optimization" << endl;
}
cout << "Hello, World!" << endl;
return 0;
Для сборки я использую следующий файл CMake:
cmake_minimum_required(VERSION 3.2)
project(gurobitest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(gurobitest ${SOURCE_FILES})
if (GUROBI_INCLUDE_DIR)
# in cache already
set(GUROBI_FOUND TRUE)
set(GUROBI_INCLUDE_DIRS "${GUROBI_INCLUDE_DIR}" )
set(GUROBI_LIBRARIES "${GUROBI_LIBRARY};${GUROBI_CXX_LIBRARY}" )
else (GUROBI_INCLUDE_DIR)
find_path(GUROBI_INCLUDE_DIR
NAMES gurobi_c++.h
PATHS "/Library/gurobi604/mac64/include""$ENV{GUROBI_HOME}/include""C:\\libs\\gurobi604\\include"#CMAKE_ROOT_PATH "/Library/gurobi604/mac64")
find_library( GUROBI_LIBRARY
NAMES gurobi
gurobi45
gurobi46
gurobi50
gurobi51
gurobi52
gurobi55
gurobi56
gurobi60
libgurobi_c++.a
libgurobi60.so
PATHS "$ENV{GUROBI_HOME}/lib""/Library/gurobi604/mac64/lib""/Library/gurobi604/mac64/lib""C:\\libs\\gurobi604\\lib")
find_library( GUROBI_CXX_LIBRARY
NAMES gurobi_c++
libgurobi60.so
libgurobi_c++.a
PATHS "$ENV{GUROBI_HOME}/lib""/Library/gurobi604/mac64/lib""C:\\libs\\gurobi604\\lib"
)
set(GUROBI_INCLUDE_DIRS "${GUROBI_INCLUDE_DIR}" )
set(GUROBI_LIBRARIES "${GUROBI_LIBRARY};${GUROBI_CXX_LIBRARY}" )endif(GUROBI_INCLUDE_DIR)
include_directories(${GUROBI_INCLUDE_DIR})
target_link_libraries(gurobitest ${GUROBI_CXX_LIBRARY})
target_link_libraries(gurobitest ${GUROBI_LIBRARY})
Тем не менее, я всегда получаю проблемы при компиляции. Затем появляется следующее сообщение об ошибке:
Linking CXX executable gurobitest
Undefined symbols for architecture x86_64:
и кажется, что все команды grub не известны.
Я использую Mac, если это важно. Есть полезные советы?
Мой друг нашел ответ. Последняя часть была не совсем правильной:
include_directories( ${GUROBI_INCLUDE_DIRS} )
target_link_libraries( gurobitest ${GUROBI_LIBRARIES} )
set (CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -stdlib=libstdc++")
set (CMAKE_SHARED_LINKER_FLAGS "-lgurobi_c++ -lgurobi60, --as-needed")
Так что, очевидно, флаги не были установлены правильно.