使用MINGW从Linux编译Windows可执行文件并链接到CPLEX库

时间:2018-05-23 16:37:02

标签: c++ linux compilation mingw cplex

这项工作的目的是阻止我进入双启动窗口,必须在同一系统中安装CPLEX两次(存储空间非常有限),并且能够从我的主操作系统编译所需的跨平台可执行文件,这是debian linux。

因此我使用的是mingw64,我的编译脚本如下所示:

#!/bin/sh
#COMPILATION FLAGS
FLAGS='-DIL_STD -DILOUSEMT -D_REENTRANT'
EXTRA='-std=c++11 -static -static-libgcc -static-libstdc++'
#INCLUDES
OPL_INCL='-I/opt/ibm/ILOG/CPLEX_Studio128/opl/include'
CPL_INCL='-I/opt/ibm/ILOG/CPLEX_Studio128/cplex/include'
CON_INCL='-I/opt/ibm/ILOG/CPLEX_Studio128/concert/include'
#LINKER
OPL_LIB='-L/opt/ibm/ILOG/CPLEX_Studio128/opl/lib/x64_windows_vs2017/stat_mda'
CPL_LIB='-L/opt/ibm/ILOG/CPLEX_Studio128/cplex/lib/x64_windows_vs2017/stat_mda'
CON_LIB='-L/opt/ibm/ILOG/CPLEX_Studio128/concert/lib/x64_windows_vs2017/stat_mda'

#echo $FLAGS
/usr/bin/x86_64-w64-mingw32-g++ $FLAGS $OPL_INCL $EXTRA main.cpp $OPL_LIB $CON_LIB $CPL_LIB -lcplex -lm -lpthread
#g++ -std=c++11 $FLAGS $OPL_INCL main.cpp $OPL_LIB $CON_LIB $CPL_LIB -lcplex -lm -lpthread

我所做的是我从另一个Windows安装中复制了windows文件的windows版本,现在我正在尝试使用全局(我想)包含文件来编译我的代码但是使用windows版本(.lib) )必要的cplex库。

我认为噩梦将成为联系,但令我惊讶的是,我甚至没有设法到达那里。由于缺少generic.h文件,Mingw编译器正在中止编译(从我理解的一些搜索,它应该与内核或其他东西相关)

In file included from /opt/ibm/ILOG/CPLEX_Studio128/opl/include/ilconcert/iloenv.h:21:0,
                 from /opt/ibm/ILOG/CPLEX_Studio128/opl/include/ilconcert/iloalg.h:21,
                 from /opt/ibm/ILOG/CPLEX_Studio128/opl/include/ilconcert/ilomodel.h:21,
                 from /opt/ibm/ILOG/CPLEX_Studio128/opl/include/ilcplex/ilocplex.h:27,
                 from /opt/ibm/ILOG/CPLEX_Studio128/opl/include/ilopl/iloopl.h:23,
                 from main.cpp:3:
/opt/ibm/ILOG/CPLEX_Studio128/opl/include/ilconcert/ilosys.h:262:21: fatal error: generic.h: No such file or directory
 #include "generic.h"
                     ^
compilation terminated.

我还尝试过使用g++进行编译测试,并且很快就绕过了这个错误,正如预期的那样,新错误与链接cplex库有关:/usr/bin/ld: cannot find -lcplex,这可能是因为我有错误不包括linux库文件夹。

我有希望这样做或者首先是不可能的吗?

PS:我有一个更简单的代码片段,我正在做同样的事情(没有CPLEX),编译就像魅力一样。所以我认为这个问题也应该与CPLEX相关。

1 个答案:

答案 0 :(得分:1)

简短的回答是否定的;你可能没有希望让它发挥作用。

在第{262}行的ilosys.h中,我们看到以下内容:

#if !(defined(name2))
# if defined(ILO_MSVC) || defined(ILO_LINUX) || defined(ILO_APPLE) || defined(ILO_HP11)
#  undef name2
#  define name2(a,b)      _name2_aux(a,b)
#  define _name2_aux(a,b)      a##b
# else
#include "generic.h"
# endif
#endif

可疑部分是ILO_MSVC未定义,这就是为什么要包含generic.h的原因。如果我们在第11行转到ilosys.h,我们会看到:

#if defined(_MSC_VER)
# undef  _Windows
# define _Windows
# undef  _WINDOWS
# define _WINDOWS
# undef  ILO_WINDOWS
# define ILO_WINDOWS
# undef  ILO_MSVC
# define ILO_MSVC
#include <stddef.h>
# if defined(_WIN64)
#  undef  ILO64
#  define ILO64
#  undef  ILO_WIN64
#  define ILO_WIN64
# else
#  undef  ILO_WIN32
#  define ILO_WIN32
# endif
//# if defined(ILO_MSVC8)
//#  undef _WIN32_WINNT
//#  define _WIN32_WINNT 0x0400
//# endif
#endif

因此,ILO_MSVC仅在定义_MSC_VER时定义。并且,_MSC_VER仅在安装了Microsoft Visual C ++编译器时定义(例如,请参阅here)。

最后,如果你查看CPLEX和Windows的detailed system requirements,很明显需要Microsoft Visual Studio 2015或2017。