Ошибка связывания для приложения C с использованием API PKCS#11

Я пытаюсь скомпилировать пример базового кода, который выполняет только инициализацию PKCS#11, но получает следующую ошибку;

gcc pkcs11_example1.c -o pk -L /usr/lib64/pkcs11/opensc-pkcs11.so 
/tmp/cc8Dl0HE.o: In function `initialize':
pkcs11_example1.c:(.text+0x10): undefined reference to `C_GetFunctionList'
pkcs11_example1.c:(.text+0x2b): undefined reference to `assert'
collect2: error: ld returned 1 exit status

команда rpm показывает следующие пути

rpm -ql opensc
/usr/lib64/libopensc.so.3
/usr/lib64/libopensc.so.3.0.0
/usr/lib64/libsmm-local.so.3
/usr/lib64/libsmm-local.so.3.0.0
/usr/lib64/opensc-pkcs11.so
/usr/lib64/pkcs11
/usr/lib64/pkcs11-spy.so
/usr/lib64/pkcs11/opensc-pkcs11.so
/usr/lib64/pkcs11/pkcs11-spy.so

мой код вставлен ниже

CK_RV  
initialize()
{
    CK_FUNCTION_LIST_PTR pFunctionList;
    CK_C_Initialize pC_Initialize; 
    CK_RV rv;

  /* It’s OK to call C_GetFunctionList before calling
     * C_Initialize */
    rv = C_GetFunctionList(&pFunctionList);
    assert(rv == CKR_OK);
    pC_Initialize = pFunctionList -> C_Initialize; 

    /* Call the C_Initialize function in the library */
    rv = (*pC_Initialize)(NULL_PTR);
    return rv;

}

int    
main(int argc, char **argv)
{
    rv = initialize();
}

но все равно получаю ошибку

undefined reference to `C_GetFunctionList'

Пожалуйста, руководство, как решить эту проблему

2 ответа

Решение

Я думаю, что ваша ошибка связана с тем, что ваша программа имеет правильные заголовки (определения функций), а не реализацию указанных функций. Перед тем, как вы начнете использовать функции PKCS#11, реализованные в вашей DLL (в вашем случае opensc-pkcs11.so), вам действительно нужно загрузить ее.

Я не профессионал по загрузке DLL в Unix-системах, но я думаю, что это должно сработать.

Кстати, я бы настоятельно рекомендовал вам всегда вызывать C_Finalize(...) после вызова C_Initialize.

Удачи!

Какие включаемые файлы вы используете?

#include <assert.h> 

вероятно, также нужно

#include <pkcs11.h>

Кроме того, -L - указать путь к поиску для библиотеки. -l указывает библиотеку.

поэтому вам понадобится -L/usr/lib64/ -lpkcs11

Другие вопросы по тегам