cmake — Решение IP с Gurobi и переполнением стека

Я пытаюсь решить довольно простой 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, если это важно. Есть полезные советы?

0

Решение

Мой друг нашел ответ. Последняя часть была не совсем правильной:

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")

Так что, очевидно, флаги не были установлены правильно.

0

Другие решения


По вопросам рекламы [email protected]