iodine icon indicating copy to clipboard operation
iodine copied to clipboard

How to Cross-Build for Windows

Open Seji64 opened this issue 8 years ago • 4 comments

Hello,

can someone give me some tips on how to compile a Windows binary on Linux?

I am using Debian 9 and have tried the following:

  • autoreconf --install
  • /configure --build=turingmachine-unknown-linux-gnu --host=mingw32
  • make

Then I get the following error:

make  all-am
make[1]: Verzeichnis „/opt/iodine“ wird betreten
x86_64-w64-mingw32-gcc -DHAVE_CONFIG_H -I.  -DWINDOWS32  -pedantic -O3 -fno-strict-aliasing  -MT src/iodine-common.o -MD -MP -MF src/.deps/iodine-common.Tpo -c -o src/iodine-common.o `test -f 'src/common.c' || echo './'`src/common.c
In file included from src/common.c:19:0:
./config.h:234:19: error: two or more data types in declaration specifiers
 #define socklen_t int
                   ^
In file included from src/common.c:58:0:
src/common.h:64:0: warning: "BITS_64" redefined
 #define BITS_64 1

src/common.h:56:0: note: this is the location of the previous definition
 #define BITS_64

src/common.c: In function ‘socket_set_blocking’:
src/common.c:415:31: warning: passing argument 3 of ‘ioctlsocket’ from incompatible pointer type [-Wincompatible-pointer-types]
  if (ioctlsocket(fd, FIONBIO, &blocking) != 0) {
                               ^
In file included from src/common.c:37:0:
/usr/share/mingw-w64/include/winsock2.h:977:34: note: expected ‘u_long * {aka long unsigned int *}’ but argument is of type ‘int *’
   WINSOCK_API_LINKAGE int WSAAPI ioctlsocket(SOCKET s,__LONG32 cmd,u_long *argp);
                                  ^~~~~~~~~~~
src/common.c: In function ‘check_tcp_error’:
src/common.c:469:43: warning: passing argument 4 of ‘getsockopt’ from incompatible pointer type [-Wincompatible-pointer-types]
  if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &errornum, &len) != 0) {
                                           ^
In file included from src/common.c:37:0:
/usr/share/mingw-w64/include/winsock2.h:980:34: note: expected ‘char *’ but argument is of type ‘int *’
   WINSOCK_API_LINKAGE int WSAAPI getsockopt(SOCKET s,int level,int optname,char *optval,int *optlen);
                                  ^~~~~~~~~~
Makefile:969: die Regel für Ziel „src/iodine-common.o“ scheiterte
make[1]: *** [src/iodine-common.o] Fehler 1
make[1]: Verzeichnis „/opt/iodine“ wird verlassen
Makefile:628: die Regel für Ziel „all“ scheiterte
make: *** [all] Fehler 2

It's my first time trying to cross-build so i don't have really a glue....

Thanks in advance

Seji64 avatar Nov 17 '17 23:11 Seji64

Hi and happy 2018! Currently support is unavailable for Windows which may change in the coming months depending on time and availability of Windows systems to experiment with. Perhaps the most straightforward solution is to run iodine inside a Linux VM (using for example Virtualbox). Good luck!

frekky avatar Jan 01 '18 14:01 frekky

if using windows 10 maybe you don't need a windows build at all. take a look at the Windows Subsystem for Linux.

Lanchon avatar Jan 02 '18 00:01 Lanchon

Comment out #define socklen_t int in config.h and add "-liphlpapi -lws2_32" to LIBS in makefile. Typecast the variables in the warning to respective types in common.h(not necessary, clears the warnings). At least the iodine client compiles without errors by doing the above.

twumasiandrews avatar Jan 03 '18 22:01 twumasiandrews

@Seji64 I did compile this version of iodine... you can see log here: https://gist.github.com/Anime4000/03bb3d18b0cfdfa9e2439e3dc045d0c2

Anime4000 avatar Feb 14 '18 19:02 Anime4000