Как я могу связать PDCurses, используя gcc на Windows? - PullRequest
0 голосов
/ 08 сентября 2018

Недавно я установил PDCurses 3.6 (последняя версия) на свой ноутбук HP Pavilion с Windows 7 Home Premium. Также я установил MinGW-w64 (последняя версия тоже).

Ну, я начал изучать, как использовать режим проклятий здесь , и загрузил их примеры кодов ( ncurses_programs.tar.gz ); на данный момент все было в порядке. После разархивирования программ я захотел использовать Makefile, чтобы все .exes уже были сделаны. Вот проблема.

Я запустил cmd.exe, переместился в папку, в которой находятся программы, и набрал mingw32-make -f Makefile. Это следующий процесс:

mingw32-make[1]: Entering directory 'C:/.../ncurses_programs/JustForFun'
gcc -o hanoi.o -c hanoi.c

/* throws some warnings */

gcc -o ../demo/exe/hanoi hanoi.o -lncurses
C:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64w64-mingw32/bin/ld.exe: cannot find -lncurses
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [Makefile:20: ../demo/exe/hanoi] Error 1
rm hanoi.o
mingw32-make[1]: Leaving directory 'C:/.../ncurses_programs/JustForFun'
mingw32-make: *** [Makefile:4: all] Error 2

Что ж, вы наверняка думаете: «Человек, он пытается связать ncurses, и у вас есть pdcurses, потому что вы работаете в Windows». Да, я знаю его. Вот почему я отредактировал Makefile, набрав LIBS=-lpdcurses вместо LIBS=-lncurses, но он тоже не нашел.

Я знаю, где находится pdcurses.a, поэтому я попытался с помощью консоли скомпилировать простую программу (напечатайте «Hello World!»):

gcc -LC:\PDCurses\wincon -lpdcurses -o myprogram myprogram.c

Я все еще получаю:

C:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lpdcurses
collect2.exe: error: ld returned 1 exit status

Я не знаю, что еще я могу сделать ...

Заранее спасибо!

1 Ответ

0 голосов
/ 08 сентября 2018

Связь -lname из gcc передается компоновщику, ld. Это поручает компоновщику выполнить поиск любого из файлов libname.so (общая библиотека) или libname.a (статическая библиотека), сначала в указанных каталогах поиска компоновщика (-Ldir), в указанном порядке, а затем в каталоги поиска по умолчанию, в их настроенном порядке. Когда любой из этих файлов найден в одном из поисков В каталогах компоновщик прекращает поиск и вводит библиотеку в связку. Если оно находит их в одном каталоге, а затем по умолчанию выбирает libname.so.

На портах Windows GCC, name.lib (статическая библиотека) и name.dll (динамическая библиотека) вероятно, также удовлетворит параметр -lname.

Учитывая, что у вас установлена ​​статическая библиотека PDCurses pdcurses.a -LC:\PDCurses\wincon, связь:

gcc -LC:\PDCurses\wincon -lpdcurses -o myprogram myprogram.c

не удается с:

cannot find -lpdcurses

, поскольку ни один файл не называется libpdcurses.a, libpdcurses.so, pdcurses.lib или pdcurses.dll существует в C:\PDCurses\wincon.

Переименование pdcurses.a в libpdcurses.a в этом каталоге исправит этот сбой. Если вы не хотите его переименовывать, вы можете заменить параметр связывания -lpdcurses с -l:pdcurses.a. Опция -l:name направляет компоновщик для поиска файл называется точно name.

Однако вы все равно не сможете связать свою тестовую программу с либо:

gcc -LC:\PDCurses\wincon -lpdcurses -o myprogram myprogram.c

или

gcc -LC:\PDCurses\wincon -l:pdcurses.a -o myprogram myprogram.c

Сбой связи с неопределенными ссылочными ошибками для любых символов pdcurses (функции или переменные), на которые вы ссылаетесь в myprogram.c. (Если вы на самом деле не обращаетесь к каким-либо подобным символам в myprogram.c, это не приведет к сбою, а только потому, что библиотека избыточна).

Чтобы исправить эту ошибку (которая может не повлиять на ваш make-файл, которого мы не видим), вместо этого запустите:

gcc -o myprogram myprogram.c -LC:\PDCurses\wincon -lpdcurses

или аналогично, если вы выберете -l:pdcurses.a.

Чтобы понять это, см. Ваша связь использует библиотеки перед объектными файлами, которые к ним относятся

...