Прежде всего, я новичок в C ++, поэтому, если вы знаете ответ, будьте терпеливы со мной;). Вот моя проблема:
Я хочу решить IP с Gurobi в коде C ++. Сам код кажется нормальным, поскольку нет выражений, помеченных как ошибки. Однако когда я запускаю код, я получаю следующее сообщение об ошибке:
Undefined symbols for architecture x86_64:
и много таких строк:
"GRBLinExpr::GRBLinExpr(GRBVar, double)", referenced from:
bridge_problem::max_flow_lp(time_expanded_network&, lemon::ListDigraph&, lemon::DigraphExtender<lemon::ListDigraphBase>::ArcMap<int>&, lemon::DigraphExtender<lemon::ListDigraphBase>::ArcMap<int>&, lemon::DigraphExtender<lemon::ListDigraphBase>::NodeMap<int>&) in bridge_problem.cpp.o
Я предполагаю, что ошибка в моем файле CMakeList.txt. Этот файл был создан автоматически, так как я использую Clion и для включения gurobi я ввел следующие дополнительные строки:
include_directories(/Library/gurobi604/mac64/include)
link_directories(/Library/gurobi604/mac64/lib/libgurobi_c++.a)
link_directories(/Library/gurobi604/mac64/lib/libgurobi60.so)
Любая помощь очень ценится, и если вам нужна дополнительная информация, просто дайте мне знать. (В случае, если это важно, я использовал Mac).
РЕДАКТИРОВАТЬ: я изменил свой код make, так как я нашел этот:
https://github.com/joschu/trajopt/blob/master/cmake/modules/FindGUROBI.cmake
Я изменил версию, так как у меня есть gurobi604, но она все еще не работает. Мое новое сообщение об ошибке:
fatal error: 'gurobi_c++.h' file not found #include "gurobi_c++.h"
Я не понимаю, так как я подумал
find_path(GUROBI_INCLUDE_DIR
NAMES gurobi_c++.h
PATHS "$ENV{GUROBI_HOME}/include""/Library/gurobi604/mac64/include""C:\\libs\\gurobi604\\include")
это должно быть легко найти. Любое предложение?
Из небольшой выдержки из вашего CMakeLists.txt я ожидаю, что вы должны использовать target_link_libraries
скорее, чем link_directories
,
Обычно я рекомендую ссылаться на статическую версию любой библиотеки, а не на разделяемую, если это возможно (т.е. в этом случае предпочтительнее «libgurobi_c ++. A» вместо «libgurobi60.so», предполагая, что это одна и та же библиотека, просто скомпилированная по-разному).
Итак, если ваш exe называется MyExe
Вы могли бы сделать:
target_link_libraries(MyExe /Library/gurobi604/mac64/lib/libgurobi_c++.a)
Кроме того, почти всегда лучше избегать указания жестко закодированных путей в вашем CMakeLists.txt. Хотя ваш копия «libgurobi_c ++. a» живет в «/ Library / gurobi604 / mac64 / lib /», чего не скажешь о других пользователях или на других платформах.
Вы можете избежать этого с помощью CMake «найти» библиотеку, например, вызвав find_library
:
find_library(Gurobi NAMES gurobi_c++)
if(NOT Gurobi)
message(FATAL_ERROR "Failed to find Gurobi lib. Try setting CMAKE_PREFIX_PATH")
endif()
target_link_libraries(MyExe ${Gurobi})
Затем, когда вы запускаете CMake, вам просто нужно сообщить ему, где находится библиотека Gurobi. Я не уверен, как вы это делаете в CLion, но, например, если вы запускаете CMake из командной строки, вы должны сделать:
cmake . -DCMAKE_PREFIX_PATH=/Library/gurobi604/mac64