Скомпилируйте исполняемый файл Windows из Linux, используя MINGW и связав его с библиотеками CPLEX. - PullRequest
0 голосов
/ 23 мая 2018

Смысл этих усилий состоит в том, чтобы не допустить двойную загрузку окон из-за необходимости дважды устанавливать 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 (.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 Ответ

0 голосов
/ 23 мая 2018

Краткий ответ - нет;у вас, вероятно, нет никакой надежды заставить это работать.

В 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 включен.Если мы перейдем к ilosys.h в строке 11, то увидим:

#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 ++ (например, см. здесь ).

Наконец, если вы посмотрите подробные системные требования для CPLEX и Windows, совершенно очевидно, что требуется Microsoft Visual Studio 2015 или 2017.

...