cmake — Gurobi и C ++ — как это работает вместе с использованием Clion

Прежде всего, я новичок в 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")

это должно быть легко найти. Любое предложение?

0

Решение

Из небольшой выдержки из вашего 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
0

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


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