Компилирование dhex под MINGW64? - PullRequest
0 голосов
/ 07 марта 2019

Я скачал dhex_0.69.tar.gz из http://www.dettus.net/dhex/ и распаковал его.В файле Readme говорится, что нужно просто запустить make.

. Когда я пытаюсь встроить его в оболочку MSYS2 в Windows 10, компиляция и компоновка продолжаются без проблем, я получаю .exe, который прекрасно работает:

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

Однако этот .exe будет зависеть от msys-ncursesw6.dll и msys-2.0.dll при запуске вне оболочки MSYS (то есть при запуске в командной строке cmd.exe, что вызывает ошибку - илив Power Shell, которая не вызывает ошибку; программа просто выходит из нее).

Итак, я хотел попробовать и встроить ее в MINGW64.Компиляция завершается, но с предупреждением - и связывание завершается неудачно из-за 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

Кто-нибудь знает, что мне нужно сделать, чтобы dhex скомпилировали под MINGW64 (так что это не зависитна MSYS dlls больше)?

1 Ответ

0 голосов
/ 07 марта 2019

Я скачал рассматриваемый пакет и выяснил, как скомпилировать его с помощью 64-битной цепочки инструментов MinGW-w64, предоставляемой MSYS2.

Прежде всего, установите соответствующие инструменты разработки и библиотеки:

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

Далее вам нужно отредактировать Makefile, который поставляется с пакетом. Значения LDFLAGS, CPPFLAGS и CFLAGS должны быть изменены следующим образом:

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

Некоторое объяснение: очень плохо, что Makefile имеет жестко закодированные пути в LDFLAGS и CPPFLAGS, потому что если бы вы использовали эти пути, вы бы использовали файлы из другой цепочки инструментов (основанной на msys-2.0.dll). Поэтому нам нужно избавиться от них. Кроме того, чтобы избавиться от всех предупреждений о форматировании printf, мы должны предоставить аргумент -D__USE_MINGW_ANSI_STDIO.

Тогда просто запустите make.

...