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

Posted

技术标签:

【中文标题】使用 MINGW 从 linux 编译 Windows 可执行文件并与 CPLEX 库链接【英文标题】:Compile a windows executable from linux using MINGW and linking with CPLEX libraries 【发布时间】:2018-05-23 16:37:02 【问题描述】:

这项工作的目的是防止我使用双启动窗口,必须在同一系统中安装两次 CPLEX(存储空间非常有限),并且 ofc 能够从我的主操作系统编译所需的跨平台可执行文件,即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 版本(.lib ) 的必要 cplex 库。

我以为噩梦会是链接,但令我惊讶的是,我什至没有设法到达那里。 Mingw 编译器正在中止编译,因为缺少 generic.h 文件(根据我的一些搜索了解,它应该与内核或其他东西有关)

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】:

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

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

#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。

【讨论】:

hmm 所以这可能就是为什么平台版本足以满足 vs2017 和 vs2015 的原因。非常感谢你。我想我会用我的家用电脑来救援:D 哦,顺便说一句@rkersh,由于您是 cplex 优化器团队的一员,我想您可以确认不同 cplex 发行版之间的包含文件是否不同?我在问,因为我在想也许我至少可以在 linux 上安装 windows 版本,而只是节省一点空间。这会导致任何形式的冲突吗? 据我所知,无论平台如何,包含文件都是相同的。但是,构建过程非常复杂,如果这条规则有例外,我也不会感到惊讶。这些天磁盘空间很便宜,所以我不知道我会为此浪费任何精力......

以上是关于使用 MINGW 从 linux 编译 Windows 可执行文件并与 CPLEX 库链接的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 MinGW 在 Linux 上构建 Crypto++ 库?

OpenGL + Mesa 3D + MinGW

将 inotify 与 MinGW 一起使用

在Linux下使用MinGW静态交叉编译带有zlib的libcurl(包括交叉编译openssl,即--cross-compile-prefix=i686-w64-mingw32- mingw)(代码

如何安装 BerkeleyDB for Mingw Linux 编译环境