Ist es möglich, C++-Quellcode, der ursprünglich für Microsoft Windows geschrieben wurde, für GNU/Linux zu plattformübergreifend zu kompilieren?

Ist es möglich, C++-Quellcode, der ursprünglich für Microsoft Windows geschrieben wurde, für GNU/Linux zu plattformübergreifend zu kompilieren?

Ich versuche, Software, die für Windows gedacht ist, aus dem Quellcode zu kompilieren. Die Software, die ich speziell kompilieren möchte, ist eine Anwendung namens Keeperfx für Dungeon Keeper. Mir gefällt dieses Spiel, also dachte ich, ich könnte den Quellcode unter Linux kompilieren und sehen, ob es funktioniert. Ich habe jedoch nicht so viel Glück.

Das Ausführen des makeBefehls führt nur zu dieser Ausgabe:

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

Also dachte ich, ich würde mingw verwenden. Aber ich bekomme immer wieder Fehler.

../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);
         ^

Ich verwende den Befehl i686-w64-mingw32-gcc-win32 -I/usr/include -L/usr/local/lib -liconv ../src/*.czum Kompilieren. Aber auch wenn ich einen Ausgabeort hinzufüge, wird keine Ausgabedatei ausgegeben.

Ich weiß nicht, was ich hier sonst tun soll.

Auf meinem System läuft 64-Bit-Linux Mint Version 18.1 auf Cinnamon.

Antwort1

Die erste Fehlergruppe tritt auf, weil der Quellcode nur für 32-Bit-Ziele vorgesehen ist. Beim Erstellen von KeeperFX können Sie dies erzwingen (wenn Ihr Compiler richtig eingerichtet ist), indem Sie Folgendes ausführen:

make CPP="g++ -m32"

aber dann stoßen Sie beim Erstellen auf fehlende Header – windows.h, winbase.h, io.h, – was darauf schließen lässt, dass der Code für Windows geschrieben wurde und keine Portabilitätsbedenken bestehen. Es ist nicht „reines C/C++“.basetyps.hsrc/main.cpp

KeeperFX scheint zumindest das Erstellen mit einigen Versionen von MinGW oder MinGW-w64 zu unterstützen, aber wie in den Kommentaren erwähnt, können Sie damit nur eine Windows-Binärdatei unter Linux erstellen. Sie können also unter Linux erstellen, indem Sie

make CROSS_COMPILE=i686-w64-mingw32-

und einen geeigneten Cross-Compiler, aber die resultierende Binärdatei benötigt Wine, um unter Linux ausgeführt zu werden. (Unter Mint ist der geeignete Cross-Compiler g++-mingw-w64.)

EskönnteEs wäre zwar möglich, KeeperFX ohne großen Aufwand auf SDL zu portieren, ich habe mich jedoch nicht näher damit befasst.

verwandte Informationen