libfreefare mingw32-сделать ошибку в Windows

У меня виндовс 8 64 бит.

Я успешно установил libnfc и могу использовать примеры .exe, находящиеся в libnfc\utils (например, nfc-mfclassic.exe; nfc-list.exe...)

Я хотел бы манипулировать картами Mifare и использовать формат NDEF, поэтому я пытаюсь установить libfreefare в Windows.

Я следил за учебником на libnfc.org, показывающим, как использовать libfreefare в Windows, и он работал нормально.

И я использовал cmake-gui для создания файла сборки.

Переходя к шагу mingw32-make, у меня есть эта ошибка:

[ 55%] Building C object libfreefare/CMakeFiles/freefare.dir/tlv.c.obj
Linking C shared library libfreefare.dll
CMakeFiles\freefare.dir/objects.a(mifare_desfire.c.obj):mifare_desfire.c:(.text+0x64f): undefined reference to `RAND_bytes'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x1219): undefined reference to `DES_ecb_encrypt'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x1242): undefined reference to `DES_ecb_encrypt'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x1280): undefined reference to `DES_ecb_encrypt'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x12a9): undefined reference to `DES_ecb_encrypt'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x12d0): undefined reference to `DES_ecb_encrypt'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x12f9): more undefined references to `DES_ecb_encrypt' follow
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x1489): undefined reference to `AES_set_encrypt_key'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x14a8): undefined reference to `AES_encrypt'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x14c7): undefined reference to `AES_set_decrypt_key'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_crypto.c.obj):mifare_desfire_crypto.c:(.text+0x14e6): undefined reference to `AES_decrypt'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_key.c.obj):mifare_desfire_key.c:(.text+0x17): undefined reference to `DES_set_key'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_key.c.obj):mifare_desfire_key.c:(.text+0x32): undefined reference to `DES_set_key'
CMakeFiles\freefare.dir/objects.a(mifare_desfire_key.c.obj):mifare_desfire_key.c:(.text+0x58): undefined reference to `DES_set_key'
CMakeFiles\freefare.dir/objects.a(mifare_ultralight.c.obj):mifare_ultralight.c:(.text+0x7a3): undefined reference to `DES_random_key'
collect2.exe: error: ld returned 1 exit status
libfreefare\CMakeFiles\freefare.dir\build.make:351: recipe for target 'libfreefare/libfreefare.dll' failed
mingw32-make[2]: *** [libfreefare/libfreefare.dll] Error 1
CMakeFiles\Makefile2:74: recipe for target 'libfreefare/CMakeFiles/freefare.dir/all' failed
mingw32-make[1]: *** [libfreefare/CMakeFiles/freefare.dir/all] Error 2
Makefile:116: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

Спасибо за вашу помощь !!


person wald    schedule 18.02.2015    source источник
comment
Мне кажется: 1. возможно, вы не включили в компиляцию файл, в котором есть определения вышеуказанных неопределенных переменных; 2. Возможно, вы включили этот файл в свою программу, но он не упоминается в путях к файлам Makefile, которые должен найти ваш компилятор. Не могли бы вы сначала выполнить поиск в своем файле, где упоминаются вышеуказанные переменные, а затем проверить, присутствует ли файл, в который они включены, как #include или путь к файлу находится в одном из путей Makefile.   -  person Peter    schedule 18.02.2015
comment
У вас есть совместимая версия OpenSSL и правильно ли вы связались с libcrypto?   -  person Michael Roland    schedule 18.02.2015
comment
@Peter Я обнаружил, что в mifare_desfire.c есть #include <openssl/rand.h>, поэтому я подумал, что это проблема пути, затем я изменил его на #include <D:\tools\OpenSSL-Win64\include\openssl\rand.h>, но это не сработало. В каталоге, содержащем mifare_desfire.c, есть CMakeLists.txt. Я добавил include_directories(D:\\tools\\OpenSSL-Win64\\include), но это не сработало, есть ли способ указать дополнительный каталог включения?   -  person wald    schedule 18.02.2015
comment
@MichaelRoland У меня есть Win64OpenSSL-1_0_1L.exe отсюда ссылка[/link] Не думаю, что я связался это для libcryto у меня нет его в дистрибутиве OpenSSL. У меня есть libssl32.dll, могу ли я использовать его на месте?   -  person wald    schedule 18.02.2015
comment
@wald См. этот вопрос: эквивалент Win7 OpenSSL libcrypto отсутствует   -  person Michael Roland    schedule 18.02.2015
comment
@MichaelRoland, как сделать ссылку на libcrypto, пожалуйста?   -  person wald    schedule 18.02.2015
comment
Я не знаком с вашим набором инструментов, поэтому я действительно не знаю (иначе я бы дал ответ). Я ожидаю, что у вас либо есть Makefile, в котором вы определяете библиотеки, которые должны быть включены во время компоновки. Обычно это параметр с именем LDFLAGS или LIBS, где вам нужно будет добавить -llibeay32   -  person Michael Roland    schedule 18.02.2015
comment
Поскольку мне не удалось скомпилировать libnfc более двух раз, не могли бы вы добавить, какие инструкции вы выполняли и где вы загружали компилятор, libusb и, конечно же, libnfc   -  person Stefano Mtangoo    schedule 02.02.2016


Ответы (1)


Я нашел решение:

В корне папки: libfreefare-0.4.0 есть CMakeLists.txt

Я заменил эту строку:

set(LIBS ${LIBS} ${LIBNFC_LIBRARIES} ${OPENSSL_LIBRARIES})

этим

set(LIBS ${LIBS} ${LIBNFC_LIBRARIES} D:/tools/OpenSSL-Win32/libeay32.dll D:/tools/OpenSSL-Win32/libssl32.dll)

И это работало нормально! Спасибо @MichaelRoland за советы по эквиваленту libcrypto

person wald    schedule 18.02.2015