sdbbs
sdbbs

Reputation: 5480

Compiling dhex under MINGW64?

I've downloaded dhex_0.69.tar.gz from http://www.dettus.net/dhex/ and unpacked it. The Readme says simply to run make.

When I try to build it in MSYS2 shell on Windows 10, compilation and linking proceed without any problems, I get an .exe, which works fine:

user@PC MSYS /d/src/dhex_0.69
$ make
gcc buffers.c -c -I. -I/usr/include     -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc configfile.c -c -I. -I/usr/include  -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc correlation.c -c -I. -I/usr/include -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc gpl.c -c -I. -I/usr/include -I/usr/local/include    -I/usr/include/ncurses -I/usr/local/include/ncurses -O3 -Wall
gcc hexcalc.c -c -I. -I/usr/include     -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc input.c -c -I. -I/usr/include       -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc machine_type.c -c -I. -I/usr/include        -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc main.c -c -I. -I/usr/include        -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc markers.c -c -I. -I/usr/include     -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc menu.c -c -I. -I/usr/include        -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc output.c -c -I. -I/usr/include      -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc search.c -c -I. -I/usr/include      -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc ui.c -c -I. -I/usr/include  -I/usr/local/include    -I/usr/include/ncurses -I/usr/local/include/ncurses -O3 -Wall
gcc -L/usr/lib  -L/usr/local/lib        -L/usr/lib/ncurses      -L/usr/local/lib/ncurses -o dhex buffers.o configfile.o correlation.o gpl.o hexcalc.o input.o machine_type.o main.o markers.o menu.o output.o search.o ui.o -lncurses

However, this .exe will then depend on msys-ncursesw6.dll and msys-2.0.dll when ran outside of the MSYS shell (so, when ran in Command Prompt cmd.exe, which does raise an error - or in Power Shell, which does not raise an error; the program simply exits there).

So, I wanted to try and build it in MINGW64. Compilation completes, but with warning - and linking fails due to undefined reference to '_impure_ptr':

user@PC MINGW64 /d/src/dhex_0.69
$ make
gcc buffers.c -c -I. -I/usr/include     -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc configfile.c -c -I. -I/usr/include  -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc correlation.c -c -I. -I/usr/include -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
correlation.c: In function 'find_longestmatch':
correlation.c:41:28: warning: unknown conversion type character 'l' in format [-Wformat=]
   else fprintf(stderr,"%16lli\r",((tInt64)buf1->bufsize-pos1));
                            ^
correlation.c:41:23: warning: too many arguments for format [-Wformat-extra-args]
   else fprintf(stderr,"%16lli\r",((tInt64)buf1->bufsize-pos1));
                       ^~~~~~~~~~
correlation.c: In function 'find_bestmatch':
correlation.c:129:28: warning: unknown conversion type character 'l' in format [-Wformat=]
   else fprintf(stderr,"%16lli\r",((tInt64)buf1->bufsize-pos1));
                            ^
correlation.c:129:23: warning: too many arguments for format [-Wformat-extra-args]
   else fprintf(stderr,"%16lli\r",((tInt64)buf1->bufsize-pos1));
                       ^~~~~~~~~~
correlation.c: In function 'find_mindiff':
correlation.c:210:28: warning: unknown conversion type character 'l' in format [-Wformat=]
   else fprintf(stderr,"%16lli\r",((tInt64)buf1->bufsize-pos1));
                            ^
correlation.c:210:23: warning: too many arguments for format [-Wformat-extra-args]
   else fprintf(stderr,"%16lli\r",((tInt64)buf1->bufsize-pos1));
                       ^~~~~~~~~~
gcc gpl.c -c -I. -I/usr/include -I/usr/local/include    -I/usr/include/ncurses -I/usr/local/include/ncurses -O3 -Wall
gcc hexcalc.c -c -I. -I/usr/include     -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc input.c -c -I. -I/usr/include       -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
input.c: In function 'decinput':
input.c:116:27: warning: unknown conversion type character 'l' in format [-Wformat=]
   snprintf(tmpbuf,21,"%20lli",newval);
                           ^
input.c:116:22: warning: too many arguments for format [-Wformat-extra-args]
   snprintf(tmpbuf,21,"%20lli",newval);
                      ^~~~~~~~
gcc machine_type.c -c -I. -I/usr/include        -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc main.c -c -I. -I/usr/include        -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
main.c: In function 'main':
main.c:765:36: warning: unknown conversion type character 'l' in format [-Wformat=]
   if (gosearch1) fprintf(stderr,"%lli occurances found in %s\n",search1.occurancesfound,buf1->filename);
                                    ^
main.c:765:60: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'tInt64' {aka 'long long int'} [-Wformat=]
   if (gosearch1) fprintf(stderr,"%lli occurances found in %s\n",search1.occurancesfound,buf1->filename);
                                                           ~^    ~~~~~~~~~~~~~~~~~~~~~~~
                                                           %I64d
main.c:765:33: warning: too many arguments for format [-Wformat-extra-args]
   if (gosearch1) fprintf(stderr,"%lli occurances found in %s\n",search1.occurancesfound,buf1->filename);
                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:766:36: warning: unknown conversion type character 'l' in format [-Wformat=]
   if (gosearch2) fprintf(stderr,"%lli occurances found in %s\n",search2.occurancesfound,buf2->filename);
                                    ^
main.c:766:60: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'tInt64' {aka 'long long int'} [-Wformat=]
   if (gosearch2) fprintf(stderr,"%lli occurances found in %s\n",search2.occurancesfound,buf2->filename);
                                                           ~^    ~~~~~~~~~~~~~~~~~~~~~~~
                                                           %I64d
main.c:766:33: warning: too many arguments for format [-Wformat-extra-args]
   if (gosearch2) fprintf(stderr,"%lli occurances found in %s\n",search2.occurancesfound,buf2->filename);
                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gcc markers.c -c -I. -I/usr/include     -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
markers.c: In function 'writemarkerfile':
markers.c:94:21: warning: unknown conversion type character 'l' in format [-Wformat=]
   fprintf(f,"%c%016llX\n",markers->relative[i],markers->cursorpos[i]);
                     ^
markers.c:94:13: warning: too many arguments for format [-Wformat-extra-args]
   fprintf(f,"%c%016llX\n",markers->relative[i],markers->cursorpos[i]);
             ^~~~~~~~~~~~~
markers.c: In function 'gotomask':
markers.c:170:25: warning: unknown conversion type character 'l' in format [-Wformat=]
    snprintf(buf,17,"%c%llx",markers->relative[i],markers->cursorpos[i]);
                         ^
markers.c:170:20: warning: too many arguments for format [-Wformat-extra-args]
    snprintf(buf,17,"%c%llx",markers->relative[i],markers->cursorpos[i]);
                    ^~~~~~~~
gcc menu.c -c -I. -I/usr/include        -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc output.c -c -I. -I/usr/include      -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
gcc search.c -c -I. -I/usr/include      -I/usr/local/include    -I/usr/include/ncurses  -I/usr/local/include/ncurses -O3 -Wall
search.c: In function 'searchfor':
search.c:128:52: warning: unknown conversion type character 'l' in format [-Wformat=]
    if (search->writesearchlog) fprintf(fwlog,"%016llx\n",(tUInt64)actcursorpos+buf->baseaddr); else done=1;
                                                    ^
search.c:128:46: warning: too many arguments for format [-Wformat-extra-args]
    if (search->writesearchlog) fprintf(fwlog,"%016llx\n",(tUInt64)actcursorpos+buf->baseaddr); else done=1;
                                              ^~~~~~~~~~~
gcc ui.c -c -I. -I/usr/include  -I/usr/local/include    -I/usr/include/ncurses -I/usr/local/include/ncurses -O3 -Wall
gcc -L/usr/lib  -L/usr/local/lib        -L/usr/lib/ncurses      -L/usr/local/lib/ncurses -o dhex buffers.o configfile.o correlation.o gpl.o hexcalc.o input.o machine_type.o main.o markers.o menu.o output.o search.o ui.o -lncurses
correlation.o:correlation.c:(.rdata$.refptr._impure_ptr[.refptr._impure_ptr]+0x0): undefined reference to `_impure_ptr'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:27: dhex] Error 1

Would anyone know what I need to do, in order to have dhex compiled under MINGW64 (so it does not depend on MSYS dlls anymore)?

Upvotes: 0

Views: 216

Answers (1)

David Grayson
David Grayson

Reputation: 87486

I downloaded the package in question and figured out how to compile it with the MinGW-w64 64-bit toolchain provided by MSYS2.

First of all, install the relevant development tools and libraries:

pacman -S base-devel mingw-w64-x86_64-{ncurses,toolchain}

Next, you need to edit the Makefile that comes with the package. The LDFLAGS, CPPFLAGS, and CFLAGS values must be modified to the following:

LDFLAGS=
CPPFLAGS= -I$(MINGW_PREFIX)/include/ncurses
CFLAGS= -D__USE_MINGW_ANSI_STDIO=1 -O3 -Wall

Some explanation: It is very bad that the Makefile has hardcoded paths in LDFLAGS and CPPFLAGS, because if you were to use those paths then you would be using files from another toolchain (the msys-2.0.dll-based one). So we need to get to get rid of those. Also, to get rid of all the warnings about printf formatting, we must supply the -D__USE_MINGW_ANSI_STDIO argument.

Then, just run make.

Upvotes: 0

Related Questions