如何使用 G++ 和 CPLEX 修复此 "undefined reference" 错误?

How can I fix this "undefined reference" error using G++ and CPLEX?

如果这不是提出问题的正确社区,我深表歉意,在那种情况下,请告诉我是哪一个。 我尝试了一些 IBM 论坛,但是当我尝试在那里启动线程时出现(一般?)错误。我对 CPLEX(在 Windows、visual studio c++ 上很有经验),但是当我尝试在 Ubuntu 上用 g++ 编译以下简单的空模型时,出现错误。我正在处理的代码是这样的: ModelFlow.cpp:

#include <lsndp_heuristic/ModelFlow.h>

ModelFlow::ModelFlow(HeurGraph graph, Instance::ptr instance)
:   graph(graph), instance(instance), env(), model(env), cplex(model)
{
}

ModelFlow.h:

class ModelFlow
{
 private:
 IloEnv env;
 IloModel model;
 IloCplex cplex;

 HeurGraph graph;
 Instance::ptr instance;

 public:
 ModelFlow(HeurGraph graph, Instance::ptr Instance);
 ModelFlow() = default;
 ~ModelFlow() = default;
};

当我运行“make”时的错误信息输出是这样的(由我“格式化”):

g++ -g -std=c++17 -D IL_STD 
-I LinerNetworks/src 
-I /usr/include/boost 
-I /opt/ibm/ILOG/CPLEX_Studio1210/concert/include 
-I /opt/ibm/ILOG/CPLEX_Studio1210/cplex/include 
-L /opt/ibm/ILOG/CPLEX_Studio1210/concert/lib/x86-64_linux/static_pic 
-L /opt/ibm/ILOG/CPLEX_Studio1210/cplex/lib/x86-64_linux/static_pic 
LinerNetworks/obj/shared/SailingLeg.o 
LinerNetworks/obj/shared/Ship.o 
LinerNetworks/obj/shared/Port.o 
LinerNetworks/obj/shared/ShipRoute.o 
LinerNetworks/obj/shared/Instance.o 
LinerNetworks/obj/new_liner_networks/graph/Arc.o 
LinerNetworks/obj/new_liner_networks/graph/Node.o 
LinerNetworks/obj/new_liner_networks/graph/GraphFactory.o 
LinerNetworks/obj/lsndp_heuristic/FlowAlgorithm.o 
LinerNetworks/obj/lsndp_heuristic/Main.o 
LinerNetworks/obj/lsndp_heuristic/MoveShip.o 
LinerNetworks/obj/lsndp_heuristic/AddPort.o 
LinerNetworks/obj/lsndp_heuristic/Neighborhood.o 
LinerNetworks/obj/lsndp_heuristic/RemovePort.o 
LinerNetworks/obj/lsndp_heuristic/ModelFlow.o 
LinerNetworks/obj/lsndp_heuristic/Misc.o 
LinerNetworks/obj/lsndp_heuristic/Solution.o 
LinerNetworks/obj/lsndp_heuristic/graph/ArcHeur.o 
LinerNetworks/obj/lsndp_heuristic/graph/NodeHeur.o 
LinerNetworks/obj/lsndp_heuristic/graph/GraphFactoryHeur.o 
-o heuristic
/usr/bin/ld: LinerNetworks/obj/lsndp_heuristic/ModelFlow.o: in function `ModelFlow::ModelFlow(boost::adjacency_list<boost::vecS, boost::listS, boost::bidirectionalS, VertexProperty, EdgeProperty, boost::no_property, boost::listS>, std::shared_ptr<Instance>)':
/home/nemanja/Projects/phd/lsndp_heuristic/LinerNetworks/src/lsndp_heuristic/ModelFlow.cpp:4: undefined reference to `IloEnv::IloEnv()'
/usr/bin/ld: /home/nemanja/Projects/phd/lsndp_heuristic/LinerNetworks/src/lsndp_heuristic/ModelFlow.cpp:4: undefined reference to `IloModel::IloModel(IloEnv, char const*)'
/usr/bin/ld: /home/nemanja/Projects/phd/lsndp_heuristic/LinerNetworks/src/lsndp_heuristic/ModelFlow.cpp:4: undefined reference to `IloCplex::IloCplex(IloModel)'
collect2: error: ld returned 1 exit status
make: *** [makefile:26: all] Error 1

我检查了文件夹 /opt/.../concert/include 和 /opt/.../cplex/include,它们确实包含文件 iloenv.h、ilocplex.h、ilocplexi.h 和 ilomodel.h。特别是出于这个原因,我不知道我做错了什么。 如果我需要提供更多信息,请告诉我。对于此 post 中的任何初学者问题提前致歉,这是我的第一个 post。愿 Covid-19 跳过你。

您似乎缺少 linker 所需的库。您只指定了 -L 选项来告诉 link 人在哪里可以找到这些库。您没有添加 -l 选项来告诉 link 哪些库。尝试在 -o heuristic:

之前添加这个
-lconcert -lilocplex -lcplex -lm -lpthread -ldl

一般来说,要找到正确的编译标志,您可以转到 INSTALLDIR/cplex/examples/x86-64_linux/static_pic 和 运行 make blend。这显示了编译和 linker 命令,您可以从那里获取所需的标志。