![¿Es posible realizar una compilación cruzada del código fuente de C++, que fue escrito originalmente para Windows de Microsoft, en Gnu/linux?](https://rvso.com/image/112002/%C2%BFEs%20posible%20realizar%20una%20compilaci%C3%B3n%20cruzada%20del%20c%C3%B3digo%20fuente%20de%20C%2B%2B%2C%20que%20fue%20escrito%20originalmente%20para%20Windows%20de%20Microsoft%2C%20en%20Gnu%2Flinux%3F.png)
Estoy intentando compilar software destinado a Windows desde la fuente. El software que estoy intentando compilar específicamente es una aplicación llamada Keeperfx para Dungeon Keeper. Disfruto ese juego, así que pensé en compilar su código fuente en Linux y ver si funciona. Sin embargo, no estoy teniendo tanta suerte.
Ejecutar el make
comando solo da este resultado:
mkdir -p obj/std
Building file: src/main.cpp
g++ -I"directx/include" -I"sdl/include" -I"libav/include" -c -fmessage-length=0 -Wall -Wno-sign-compare -Wno-unused-parameter -Wno-strict-aliasing -Wno-unknown-pragmas -MMD -MP -MF"obj/std/main.d" -MT"obj/std/main.d" -march=i686 -fno-omit-frame-pointer -O3 -DBFDEBUG_LEVEL=0 -o"obj/std/main.o" "src/main.cpp"
src/main.cpp:1:0: error: CPU you selected does not support x86-64 instruction set
#pragma region includes
^
src/main.cpp:1:0: error: CPU you selected does not support x86-64 instruction set
Makefile:658: recipe for target 'obj/std/main.o' failed
make: *** [obj/std/main.o] Error 1
Entonces pensé en usar mingw. Pero sigo recibiendo errores.
../src/bflib_crash.c: In function ‘sigstr’:
../src/bflib_crash.c:77:10: error: ‘SIGBREAK’ undeclared (first use in this function)
case SIGBREAK : return "Ctrl-Break (Win32)";
^
../src/bflib_crash.c:77:10: note: each undeclared identifier is reported only once for each function it appears in
../src/bflib_crash.c: In function ‘LbErrorParachuteInstall’:
../src/bflib_crash.c:189:12: error: ‘SIGBREAK’ undeclared (first use in this function)
signal(SIGBREAK,ctrl_handler);
^
In file included from ../src/bflib_dernc.c:26:0:
/usr/include/fcntl.h:202:12: error: conflicting types for ‘creat’
extern int creat (const char *__file, mode_t __mode) __nonnull ((1));
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:314:15: note: previous declaration of ‘creat’ was here
int __cdecl creat(const char *_Filename,int _PermissionMode) __MINGW_ATTRIB_D
^
In file included from ../src/bflib_dernc.c:27:0:
/usr/include/sys/stat.h:283:12: error: conflicting types for ‘chmod’
extern int chmod (const char *__file, __mode_t __mode)
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:311:15: note: previous declaration of ‘chmod’ was here
int __cdecl chmod(const char *_Filename,int _AccessMode) __MINGW_ATTRIB_DEPRE
^
In file included from ../src/bflib_dernc.c:27:0:
/usr/include/sys/stat.h:311:17: error: conflicting types for ‘umask’
extern __mode_t umask (__mode_t __mask) __THROW;
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:328:15: note: previous declaration of ‘umask’ was here
int __cdecl umask(int _Mode) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
In file included from ../src/bflib_dernc.c:27:0:
/usr/include/sys/stat.h:320:12: error: conflicting types for ‘mkdir’
extern int mkdir (const char *__path, __mode_t __mode)
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:267:15: note: previous declaration of ‘mkdir’ was here
int __cdecl mkdir (const char *) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
In file included from ../src/bflib_fileio.c:28:0:
/usr/include/fcntl.h:202:12: error: conflicting types for ‘creat’
extern int creat (const char *__file, mode_t __mode) __nonnull ((1));
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:314:15: note: previous declaration of ‘creat’ was here
int __cdecl creat(const char *_Filename,int _PermissionMode) __MINGW_ATTRIB_D
^
In file included from ../src/bflib_fileio.c:29:0:
/usr/include/sys/stat.h:283:12: error: conflicting types for ‘chmod’
extern int chmod (const char *__file, __mode_t __mode)
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:311:15: note: previous declaration of ‘chmod’ was here
int __cdecl chmod(const char *_Filename,int _AccessMode) __MINGW_ATTRIB_DEPRE
^
In file included from ../src/bflib_fileio.c:29:0:
/usr/include/sys/stat.h:311:17: error: conflicting types for ‘umask’
extern __mode_t umask (__mode_t __mask) __THROW;
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:328:15: note: previous declaration of ‘umask’ was here
int __cdecl umask(int _Mode) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
In file included from ../src/bflib_fileio.c:29:0:
/usr/include/sys/stat.h:320:12: error: conflicting types for ‘mkdir’
extern int mkdir (const char *__path, __mode_t __mode)
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:267:15: note: previous declaration of ‘mkdir’ was here
int __cdecl mkdir (const char *) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
../src/bflib_fileio.c: In function ‘LbFileOpen’:
../src/bflib_fileio.c:237:43: error: ‘O_BINARY’ undeclared (first use in this function)
rc = _sopen(fname, O_RDWR|O_CREAT|O_BINARY, SH_DENYNO, S_IREAD|S_IWRITE
^
../src/bflib_fileio.c:237:43: note: each undeclared identifier is reported only once for each function it appears in
In file included from /usr/include/bits/errno.h:24:0,
from /usr/include/errno.h:35,
from /usr/share/mingw-w64/include/intrin.h:65,
from /usr/include/SDL2/SDL_cpuinfo.h:44,
from /usr/include/SDL2/SDL.h:38,
from ../src/bflib_keybrd.c:25:
/usr/include/linux/errno.h:1:23: fatal error: asm/errno.h: No such file or directory
compilation terminated.
../src/bflib_math.c: In function ‘LbRandomSeries’:
../src/bflib_math.c:746:11: warning: implicit declaration of function ‘_lrotr’ [-Wimplicit-function-declaration]
*seed = _lrotr(i, 13);
^
../src/bflib_tcpsp.c:26:26: fatal error: SDL2/SDL_net.h: No such file or directory
#include <SDL2/SDL_net.h>
^
compilation terminated.
In file included from /usr/include/bits/errno.h:24:0,
from /usr/include/errno.h:35,
from /usr/share/mingw-w64/include/intrin.h:65,
from /usr/include/SDL2/SDL_cpuinfo.h:44,
from /usr/include/SDL2/SDL.h:38,
from ../src/bflib_video.c:27:
/usr/include/linux/errno.h:1:23: fatal error: asm/errno.h: No such file or directory
compilation terminated.
In file included from /usr/include/bits/errno.h:24:0,
from /usr/include/errno.h:35,
from /usr/share/mingw-w64/include/intrin.h:65,
from /usr/include/SDL2/SDL_cpuinfo.h:44,
from /usr/include/SDL2/SDL.h:38,
from ../src/bflib_vidsurface.c:25:
/usr/include/linux/errno.h:1:23: fatal error: asm/errno.h: No such file or directory
compilation terminated.
../src/config.c: In function ‘recognize_conf_command’:
../src/config.c:275:13: warning: implicit declaration of function ‘strnicmp’ [-Wimplicit-function-declaration]
if (strnicmp(buf+(*pos), commands[i].name, cmdname_len) == 0)
^
../src/config.c: In function ‘get_language_lwrstr’:
../src/config.c:424:3: warning: implicit declaration of function ‘strlwr’ [-Wimplicit-function-declaration]
strlwr(lang_str);
^
../src/front_network.c: In function ‘net_write_config_file’:
../src/front_network.c:503:9: warning: implicit declaration of function ‘strupr’ [-Wimplicit-function-declaration]
strupr(net_config_info.str_atz);
^
../src/lvl_filesdk1.c: In function ‘get_level_number_from_file_name’:
../src/lvl_filesdk1.c:108:7: warning: implicit declaration of function ‘strnicmp’ [-Wimplicit-function-declaration]
if (strnicmp(fname,"map",3) != 0)
^
../src/lvl_script.c: In function ‘get_next_word’:
../src/lvl_script.c:446:9: warning: implicit declaration of function ‘strupr’ [-Wimplicit-function-declaration]
strupr(param);
^
../src/lvl_script.c: In function ‘get_map_location_code_name’:
../src/lvl_script.c:792:9: warning: implicit declaration of function ‘itoa’ [-Wimplicit-function-declaration]
itoa(apt->num, name, 10);
^
nicholas@LinuxNick ~/.apps/keeperfx/bin $ sudo i686-w64-mingw32-gcc-win32 -I/usr/include -L/usr/local/lib -liconv ../src/*.c -o keeperfx/
[sudo] password for nicholas:
../src/bflib_crash.c: In function ‘sigstr’:
../src/bflib_crash.c:77:10: error: ‘SIGBREAK’ undeclared (first use in this function)
case SIGBREAK : return "Ctrl-Break (Win32)";
^
../src/bflib_crash.c:77:10: note: each undeclared identifier is reported only once for each function it appears in
../src/bflib_crash.c: In function ‘LbErrorParachuteInstall’:
../src/bflib_crash.c:189:12: error: ‘SIGBREAK’ undeclared (first use in this function)
signal(SIGBREAK,ctrl_handler);
^
In file included from ../src/bflib_dernc.c:26:0:
/usr/include/fcntl.h:202:12: error: conflicting types for ‘creat’
extern int creat (const char *__file, mode_t __mode) __nonnull ((1));
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:314:15: note: previous declaration of ‘creat’ was here
int __cdecl creat(const char *_Filename,int _PermissionMode) __MINGW_ATTRIB_D
^
In file included from ../src/bflib_dernc.c:27:0:
/usr/include/sys/stat.h:283:12: error: conflicting types for ‘chmod’
extern int chmod (const char *__file, __mode_t __mode)
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:311:15: note: previous declaration of ‘chmod’ was here
int __cdecl chmod(const char *_Filename,int _AccessMode) __MINGW_ATTRIB_DEPRE
^
In file included from ../src/bflib_dernc.c:27:0:
/usr/include/sys/stat.h:311:17: error: conflicting types for ‘umask’
extern __mode_t umask (__mode_t __mask) __THROW;
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:328:15: note: previous declaration of ‘umask’ was here
int __cdecl umask(int _Mode) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
In file included from ../src/bflib_dernc.c:27:0:
/usr/include/sys/stat.h:320:12: error: conflicting types for ‘mkdir’
extern int mkdir (const char *__path, __mode_t __mode)
^
In file included from ../src/bflib_dernc.c:25:0:
/usr/share/mingw-w64/include/io.h:267:15: note: previous declaration of ‘mkdir’ was here
int __cdecl mkdir (const char *) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
In file included from ../src/bflib_fileio.c:28:0:
/usr/include/fcntl.h:202:12: error: conflicting types for ‘creat’
extern int creat (const char *__file, mode_t __mode) __nonnull ((1));
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:314:15: note: previous declaration of ‘creat’ was here
int __cdecl creat(const char *_Filename,int _PermissionMode) __MINGW_ATTRIB_D
^
In file included from ../src/bflib_fileio.c:29:0:
/usr/include/sys/stat.h:283:12: error: conflicting types for ‘chmod’
extern int chmod (const char *__file, __mode_t __mode)
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:311:15: note: previous declaration of ‘chmod’ was here
int __cdecl chmod(const char *_Filename,int _AccessMode) __MINGW_ATTRIB_DEPRE
^
In file included from ../src/bflib_fileio.c:29:0:
/usr/include/sys/stat.h:311:17: error: conflicting types for ‘umask’
extern __mode_t umask (__mode_t __mask) __THROW;
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:328:15: note: previous declaration of ‘umask’ was here
int __cdecl umask(int _Mode) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
In file included from ../src/bflib_fileio.c:29:0:
/usr/include/sys/stat.h:320:12: error: conflicting types for ‘mkdir’
extern int mkdir (const char *__path, __mode_t __mode)
^
In file included from ../src/bflib_basics.h:23:0,
from ../src/bflib_fileio.h:23,
from ../src/bflib_fileio.c:22:
/usr/share/mingw-w64/include/io.h:267:15: note: previous declaration of ‘mkdir’ was here
int __cdecl mkdir (const char *) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
^
../src/bflib_fileio.c: In function ‘LbFileOpen’:
../src/bflib_fileio.c:237:43: error: ‘O_BINARY’ undeclared (first use in this function)
rc = _sopen(fname, O_RDWR|O_CREAT|O_BINARY, SH_DENYNO, S_IREAD|S_IWRITE
^
../src/bflib_fileio.c:237:43: note: each undeclared identifier is reported only once for each function it appears in
In file included from /usr/include/bits/errno.h:24:0,
from /usr/include/errno.h:35,
from /usr/share/mingw-w64/include/intrin.h:65,
from /usr/include/SDL2/SDL_cpuinfo.h:44,
from /usr/include/SDL2/SDL.h:38,
from ../src/bflib_keybrd.c:25:
/usr/include/linux/errno.h:1:23: fatal error: asm/errno.h: No such file or directory
compilation terminated.
../src/bflib_math.c: In function ‘LbRandomSeries’:
../src/bflib_math.c:746:11: warning: implicit declaration of function ‘_lrotr’ [-Wimplicit-function-declaration]
*seed = _lrotr(i, 13);
^
../src/bflib_tcpsp.c:26:26: fatal error: SDL2/SDL_net.h: No such file or directory
#include <SDL2/SDL_net.h>
^
compilation terminated.
In file included from /usr/include/bits/errno.h:24:0,
from /usr/include/errno.h:35,
from /usr/share/mingw-w64/include/intrin.h:65,
from /usr/include/SDL2/SDL_cpuinfo.h:44,
from /usr/include/SDL2/SDL.h:38,
from ../src/bflib_video.c:27:
/usr/include/linux/errno.h:1:23: fatal error: asm/errno.h: No such file or directory
compilation terminated.
In file included from /usr/include/bits/errno.h:24:0,
from /usr/include/errno.h:35,
from /usr/share/mingw-w64/include/intrin.h:65,
from /usr/include/SDL2/SDL_cpuinfo.h:44,
from /usr/include/SDL2/SDL.h:38,
from ../src/bflib_vidsurface.c:25:
/usr/include/linux/errno.h:1:23: fatal error: asm/errno.h: No such file or directory
compilation terminated.
../src/config.c: In function ‘recognize_conf_command’:
../src/config.c:275:13: warning: implicit declaration of function ‘strnicmp’ [-Wimplicit-function-declaration]
if (strnicmp(buf+(*pos), commands[i].name, cmdname_len) == 0)
^
../src/config.c: In function ‘get_language_lwrstr’:
../src/config.c:424:3: warning: implicit declaration of function ‘strlwr’ [-Wimplicit-function-declaration]
strlwr(lang_str);
^
../src/front_network.c: In function ‘net_write_config_file’:
../src/front_network.c:503:9: warning: implicit declaration of function ‘strupr’ [-Wimplicit-function-declaration]
strupr(net_config_info.str_atz);
^
../src/lvl_filesdk1.c: In function ‘get_level_number_from_file_name’:
../src/lvl_filesdk1.c:108:7: warning: implicit declaration of function ‘strnicmp’ [-Wimplicit-function-declaration]
if (strnicmp(fname,"map",3) != 0)
^
../src/lvl_script.c: In function ‘get_next_word’:
../src/lvl_script.c:446:9: warning: implicit declaration of function ‘strupr’ [-Wimplicit-function-declaration]
strupr(param);
^
../src/lvl_script.c: In function ‘get_map_location_code_name’:
../src/lvl_script.c:792:9: warning: implicit declaration of function ‘itoa’ [-Wimplicit-function-declaration]
itoa(apt->num, name, 10);
^
Estoy usando el comando i686-w64-mingw32-gcc-win32 -I/usr/include -L/usr/local/lib -liconv ../src/*.c
para compilar. Sin embargo, incluso agregar una ubicación de salida no genera un archivo de salida.
No sé qué más hacer aquí.
Mi sistema ejecuta Linux Mint versión 18.1 de 64 bits en Cinnamon.
Respuesta1
El primer conjunto de errores se produce porque el código fuente sólo está destinado a objetivos de 32 bits. Al compilar KeeperFX, puede forzar esto (si su compilador está configurado correctamente) ejecutando
make CPP="g++ -m32"
pero luego te encuentras con encabezados que faltan ( ,,,, windows.h
al compilar ) , lo que sugiere que el código está escrito para Windows sin problemas de portabilidad. No es "C/C++ puro".winbase.h
io.h
basetyps.h
src/main.cpp
KeeperFX parece admitir la compilación con algunas versiones de MinGW o MinGW-w64 al menos, pero como se señaló en los comentarios, eso solo le permite compilar un binario de Windows en Linux. Entonces puedes construir en Linux, usando
make CROSS_COMPILE=i686-w64-mingw32-
y un compilador cruzado apropiado, pero el binario resultante necesitará Wine para ejecutarse en Linux. (En Mint, el compilador cruzado apropiado es g++-mingw-w64
.)
Élpodríaposible portar KeeperFX a SDL sin mucho esfuerzo, no lo he analizado en detalle.