首页 > 解决方案 > 编译包含 CPLEX 工具的项目时出错

问题描述

我正在从事在某些时候必须包含 CPLEX 工具的项目。更详细地说,我实现了以下类(即相应的文件):Random.cpp、Instance.cpp、Timer.cpp。包含在 Hybrid_ea.cpp 中的 Solution.cpp 也必须包含 cplex 库。
最后,通过运行 Algorithm.cpp(此处定义的 main() 函数)执行了该项目。

我想在 Linux 平台上运行该项目,创建如下所示的 Makefile:

TARGET = Algorithm 

CXXFLAGS = -ansi -O3
GENOBJS = Random.o
#CPLOBJS = Timer.o Random.o Instance.o Hybrid_ea.o
GREOBJS = Timer.o Random.o Instance.o Solution.o Hybrid_ea.o

SYSTEM     = x86-64_linux
LIBFORMAT  = static_pic
CPLEXDIR      =  /home/root/Desktop/projects/software/cplex-12.5/cplex
CONCERTDIR    =  /home/root/Desktop/projects/software/cplex-12.5/concert
CCC = g++
CCOPT = -m64 -O -fPIC -fexceptions -DNDEBUG -DIL_STD -std=c++11 -fpermissive -w
CPLEXBINDIR   = $(CPLEXDIR)/bin/$(BINDIST)
CPLEXLIBDIR   = $(CPLEXDIR)/lib/$(SYSTEM)/$(LIBFORMAT)
CONCERTLIBDIR = $(CONCERTDIR)/lib/$(SYSTEM)/$(LIBFORMAT)
CCLNFLAGS = -L$(CPLEXLIBDIR) -lilocplex -lcplex -L$(CONCERTLIBDIR) -lconcert -lm -pthread
CLNFLAGS  = -L$(CPLEXLIBDIR) -lcplex -lm -pthread
CONCERTINCDIR = $(CONCERTDIR)/include
CPLEXINCDIR   = $(CPLEXDIR)/include
CCFLAGS = $(CCOPT) -I$(CPLEXINCDIR) -I$(CONCERTINCDIR)


all: ${TARGET}

Algorithm: Algorithm.o $(GREOBJS)
   $(CCC) $(CCFLAGS)  Algorithm.o $(GREOBJS) -o Algorithm $(CCLNFLAGS)

Algorithm.o: Algorithm.cpp
   $(CCC) -c $(CCFLAGS) Algorithm.cpp -o Algorithm.o 

clean:
   @rm -f *~ *.o ${TARGET} core

链接过程在某种程度上是错误的。我检查了,我的 CPLEX 版本是正确的,因为其他的,更简单的项目可以执行;

尝试编译项目时给出的完整输出:


g++ -c -m64 -O -fPIC -fexceptions -DNDEBUG -DIL_STD -std=c++11 -fpermissive -w -I/home/root/Desktop/projects/LCAPS_software/cplex-12.5/cplex/include -I/home/root/Desktop/projects/LCAPS_software/cplex-12.5/concert/include Algorithm.cpp -o Algorithm.o 
g++ -ansi -O3   -c -o Timer.o Timer.cc
g++ -ansi -O3   -c -o Random.o Random.cc
g++ -ansi -O3   -c -o Instance.o Instance.cpp
g++ -ansi -O3   -c -o Solution.o Solution.cpp
g++ -ansi -O3   -c -o hybrid_ea.o hybrid_ea.cpp
In file included from hybrid_ea.cpp:22:0:
hybrid_ea.h:39:10: fatal error: ilcplex/ilocplex.h: No such file or directory
 #include <ilcplex/ilocplex.h>
          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
<builtin>: recipe for target 'hybrid_ea.o' failed
make: *** [hybrid_ea.o] Error 1

任何帮助,将不胜感激。

标签: c++

解决方案


Algorithm.cpp编译该文件,并提供适当的选项来查找CPLEX包括文件:

-I/home/root/Desktop/projects/LCAPS_software/cplex-12.5/cplex/include
-I/home/root/Desktop/projects/LCAPS_software/cplex-12.5/concert/include

由于hybrid_ea.h还尝试包含一些 CPLEX 头文件,因此编译时hybrid_ea.cpp也应具有上述选项。

如果您在问题中发布的生成文件是完整的,那么我怀疑问题如下:您没有定义特定的命令来编译任何.cc.cpp 文件,除了Algorithm.cpp. 因此,所有其他文件都是使用默认命令编译的g++ -ansi -O3 -c -o [file].o [file].cpp。并且此默认命令没有用于 CPLEX 库位置的包含指令。

ftp://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html中所述,这些文件是使用 make 的隐式规则编译的。C++ 文件的隐含规则是使用$(CXX) -c $(CPPFLAGS) $(CXXFLAGS). 请注意此规则如何使用CPPFLAGSCXXFLAGS不是CCFLAGS 您在 makefile 末尾定义的变量来包含正确的包含指令。

因此,将 makefile 的结尾更改为以下内容应该可以:

CPPFLAGS = $(CCOPT) -I$(CPLEXINCDIR) -I$(CONCERTINCDIR)

all: ${TARGET}

Algorithm: Algorithm.o $(GREOBJS)
   $(CCC) $(CCFLAGS)  Algorithm.o $(GREOBJS) -o Algorithm $(CCLNFLAGS)

clean:
   @rm -f *~ *.o ${TARGET} core

定义变量CPPFLAGS后,它将自动用于编译.cpp项目中的任何文件。


推荐阅读