LINUX.ORG.RU

пакет libpcsclite-dev: не компилируется демо-программа из состава пакета

 , ,


0

1

Всем привет! Просветите в области системного программирования. Есть среда Debian GNU/Linux 12 AMD64 со всеми обновлениями. Пытаюсь освоить pcsc-lite, и вот сабжевая проблема.

Версия пакета libpcsclite-dev: 1.9.9-2.

Что делал и что получалось:

mkdir -p ~/devel/pcsclite-20240813-001 ; cd ~/devel/pcsclite-20240813-001
cp /usr/share/doc/libpcsclite-dev/examples/pcsc_demo.c .
gcc -o pcsc_demo pcsc_demo.c
pcsc_demo.c:39:10: fatal error: winscard.h: Нет такого файла или каталога
   39 | #include <winscard.h>
      |          ^~~~~~~~~~~~
compilation terminated.

, хотя winscard.h есть в /usr/include/PCSC/ . Далее

gcc -I /usr/include/PCSC/ -l pcsclite -o pcsc_demo pcsc_demo.c
/usr/bin/ld: /tmp/ccGvDSs7.o: предупреждение: перемещение указывает на «g_rgSCardT1Pci» из раздела только для чтения «.text»
/usr/bin/ld: /tmp/ccGvDSs7.o: в функции «main»:
pcsc_demo.c:(.text+0x172): неопределённая ссылка на «SCardEstablishContext»
/usr/bin/ld: pcsc_demo.c:(.text+0x1c3): неопределённая ссылка на «SCardListReaders»
/usr/bin/ld: pcsc_demo.c:(.text+0x1da): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x392): неопределённая ссылка на «SCardConnect»
/usr/bin/ld: pcsc_demo.c:(.text+0x3c4): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x438): неопределённая ссылка на «SCardStatus»
/usr/bin/ld: pcsc_demo.c:(.text+0x50d): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x55b): неопределённая ссылка на «g_rgSCardT0Pci»
/usr/bin/ld: pcsc_demo.c:(.text+0x568): неопределённая ссылка на «g_rgSCardT1Pci»
/usr/bin/ld: pcsc_demo.c:(.text+0x622): неопределённая ссылка на «SCardTransmit»
/usr/bin/ld: pcsc_demo.c:(.text+0x69b): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x6e1): неопределённая ссылка на «SCardDisconnect»
/usr/bin/ld: pcsc_demo.c:(.text+0x6f8): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x770): неопределённая ссылка на «SCardConnect»
/usr/bin/ld: pcsc_demo.c:(.text+0x7a2): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x877): неопределённая ссылка на «SCardTransmit»
/usr/bin/ld: pcsc_demo.c:(.text+0x8f0): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x947): неопределённая ссылка на «SCardReconnect»
/usr/bin/ld: pcsc_demo.c:(.text+0x95e): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0x9d2): неопределённая ссылка на «SCardStatus»
/usr/bin/ld: pcsc_demo.c:(.text+0xaa7): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0xb12): неопределённая ссылка на «SCardGetStatusChange»
/usr/bin/ld: pcsc_demo.c:(.text+0xb47): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0xb88): неопределённая ссылка на «SCardBeginTransaction»
/usr/bin/ld: pcsc_demo.c:(.text+0xb9f): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0xc74): неопределённая ссылка на «SCardTransmit»
/usr/bin/ld: pcsc_demo.c:(.text+0xced): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0xd33): неопределённая ссылка на «SCardEndTransaction»
/usr/bin/ld: pcsc_demo.c:(.text+0xd4a): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0xd8d): неопределённая ссылка на «SCardDisconnect»
/usr/bin/ld: pcsc_demo.c:(.text+0xda4): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: pcsc_demo.c:(.text+0xdf2): неопределённая ссылка на «SCardFreeMemory»
/usr/bin/ld: pcsc_demo.c:(.text+0xdfe): неопределённая ссылка на «SCardReleaseContext»
/usr/bin/ld: pcsc_demo.c:(.text+0xe15): неопределённая ссылка на «pcsc_stringify_error»
/usr/bin/ld: предупреждение: создаётся DT_TEXTREL в PIE
collect2: error: ld returned 1 exit status
У гугла спрашивал, и у яндекса, но не нашел решение проблемы. В одном месте нашел, что было сказано, что нету установленной библиотеки winscard, но это было сказано для случая виндового хоста, и я немного не представляю, как это разрулить для GNU/Linux.

Также пробовал обходной путь: поставил libpcsc-perl, у которого также есть зависимость от пакета libpcsclite1, и запускал пример оттуда — там по крайней мере видно, что что-то работает:

/usr/share/doc/libpcsc-perl/examples/single_reader.pl
Getting context:
........................................ OK
Retrieving readers'list:
  ACS ACR1252 1S CL Reader [ACR1252 Dual Reader PICC] 00 00
  ACS ACR1252 1S CL Reader [ACR1252 Dual Reader SAM] 01 00
........................................ OK
Connecting to the card:
........................................ OK
Getting Status:
  ReaderName = ACS ACR1252 1S CL Reader [ACR1252 Dual Reader PICC] 00 00
  Status = 20034
  Protocol =  2
  ATR = 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 26 00 00 00 00 4D 
........................................ OK
Exchanging data:
Can't transmit data: Transaction failed. at /usr/share/doc/libpcsc-perl/examples/single_reader.pl line 103.

★★★★★

Последнее исправление: Infra_HDC (всего исправлений: 4)

В поделке под названием gcc же вроде важен порядок аргументов и библиотеки должны быть после исходника.

gcc pcsc_demo.c -I /usr/include/PCSC/ -l pcsclite -o pcsc_demo

или

clang-14 -I /usr/include/PCSC/ -l pcsclite -o pcsc_demo pcsc_demo.c
anonymous
()
Ответ на: комментарий от anonymous

Да, это решение. Благодарю (я про первую Вашу строчку, с gcc).

Infra_HDC ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вообще-то странно с gcc: я поставил пакет gcc-doc и почитал man gcc: там русским по белому сказано, что

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-Wpedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

то есть мой изначальный вариант с порядком — файлом-исходником в конце, по официальному ману, должен работать.

Infra_HDC ★★★★★
() автор топика
Ответ на: комментарий от Infra_HDC

Да, и более того, нормальный человек вообще не предположит что свободные аргументы могут идти вперемешку с ключами. Но это же альтернативно одарённые GNU - их не надо пытаться понять, нужно просто держаться от их поделок подальше.

В man про ключ -l написано что его порядок важен. Правда, там ещё написано про static библиотеки, я не смотрел правда ли libpcsclite только статическая. Если нет, то ЕМНИП там ещё поведение отличается для случая когда на вход gcc в режиме линковки подаются объектники или исходники. Где про это может быть написано не могу предположить.

anonymous
()
Ответ на: комментарий от anonymous

я не смотрел правда ли libpcsclite только статическая

я посмотрел — линковка динамическая с libpcsclite:

ldd pcsc_demo | grep libpcsclite
        libpcsclite.so.1 => /lib/x86_64-linux-gnu/libpcsclite.so.1 (0x00007fe34c657000)

Infra_HDC ★★★★★
() автор топика
Последнее исправление: Infra_HDC (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.