1

首先,我对 C++ 完全陌生,所以如果您知道答案,请耐心等待我 ;)。这是我的问题:我想在 C++ 代码中使用 Gurobi 解决 IP。代码本身似乎很好,因为没有标记为错误的表达式。但是,当我运行代码时,我收到以下错误报告:

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很重要)。

编辑:自从我找到这个后,我更改了我的制作代码: 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"
      )

那应该很容易找到。有什么建议吗?

4

1 回答 1

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
于 2015-08-21T02:05:31.477 回答