Windows
是否可以將最初為 Microsoft 的 Windows 編寫的 C++ 原始碼交叉編譯到 Gnu/linux?
我正在嘗試從原始碼編譯適用於 Windows 的軟體。我特別想編譯的軟體是一個名為 Keeperfx for Dungeon Keeper 的應用程序。我喜歡那個遊戲,所以我想我可以在 linux 上編譯它的原始碼,看看它是否有效。但是,我沒有那麼幸運。
執行該
make
命令只會給出以下輸出: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
所以我想我會使用mingw。但我不斷收到錯誤。
../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); ^
我正在使用該命令
i686-w64-mingw32-gcc-win32 -I/usr/include -L/usr/local/lib -liconv ../src/*.c
進行編譯。但是,即使添加輸出位置,也不會輸出輸出文件。我不知道在這裡還能做什麼。
我的系統在 Cinnamon 上執行 64 位 Linux Mint 18.1 版。
發生第一組錯誤是因為原始碼僅適用於 32 位目標。在建構 KeeperFX 時,您可以通過執行強制執行此操作(如果您的編譯器設置正確)
make CPP="g++ -m32"
但是在建構時會遇到缺少的標頭——
windows.h
,winbase.h
,io.h
,這表明程式碼是為 Windows 編寫的,沒有可移植性問題。它不是“純 C/C++”。basetyps.h``src/main.cpp
KeeperFX 似乎至少支持使用某些版本的 MinGW 或 MinGW-w64 進行建構,但正如評論中指出的那樣,僅允許您在 Linux 上建構 Windows 二進製文件。所以你可以在 Linux 上建構,使用
make CROSS_COMPILE=i686-w64-mingw32-
和適當的交叉編譯器,但生成的二進製文件需要 Wine 在 Linux 上執行。(在 Mint 上,適當的交叉編譯器是
g++-mingw-w64
.)無需付出大量努力就可以將 KeeperFX 移植到 SDL,我沒有詳細研究過。