如何使用 G++ 和 CPLEX 修复此“未定义引用”错误?
Posted
技术标签:
【中文标题】如何使用 G++ 和 CPLEX 修复此“未定义引用”错误?【英文标题】:How can I fix this "undefined reference" error using G++ and CPLEX? 【发布时间】:2020-08-06 09:52:01 【问题描述】:如果这不是正确的社区来询问这个问题,我深表歉意,在这种情况下,请告诉我是哪一个。 我尝试了一些 IBM 论坛,但是当我尝试在那里启动线程时出现(一般?)错误。我对 CPLEX(在 Windows 上,使用 Visual Studio C++)方面经验丰富,但是当我尝试在 Ubuntu 上使用 g++ 编译以下简单的空模型时,出现错误。我正在处理的代码是这样的: 模型流.cpp:
#include <lsndp_heuristic/ModelFlow.h>
ModelFlow::ModelFlow(HeurGraph graph, Instance::ptr instance)
: graph(graph), instance(instance), env(), model(env), cplex(model)
模型流.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。特别是出于这个原因,我不知道我做错了什么。 如果我需要提供更多信息,请告诉我。对于这篇文章中的任何初学者问题,请提前道歉,这是我的第一篇文章。愿 Covid-19 跳过你。
【问题讨论】:
【参考方案1】:您似乎缺少链接器所需的库。您只指定了-L
选项来告诉链接器在哪里可以找到这些库。您没有添加 -l
选项来告诉要链接哪些库。尝试在-o heuristic
之前添加这个:
-lconcert -lilocplex -lcplex -lm -lpthread -ldl
一般来说,要找到正确的编译标志,您可以转到INSTALLDIR/cplex/examples/x86-64_linux/static_pic
并运行make blend
。这显示了编译和链接器命令,您可以从那里获取所需的标志。
【讨论】:
感谢您的回答,工作就像一个魅力!我是被visual studio 和它的易用性抚养长大的,自从我切换到所有Linux 和gcc 之后,我有了某种“城市男孩搬到农场”的经历!但就我而言,我的 Linux 农场在 IMO 上优于城市的 Windows以上是关于如何使用 G++ 和 CPLEX 修复此“未定义引用”错误?的主要内容,如果未能解决你的问题,请参考以下文章
PYOMO:如何创建约束松弛? (从 Pyomo 中的 CPLEX 重写约束)
如何在 Cplex (java) 中添加关于 argmax o min 的约束?