0

我正在尝试编译仅执行 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'

请指导如何解决此问题

4

2 回答 2

0

你用的是什么包含文件?

#include <assert.h> 

可能还需要

#include <pkcs11.h>

另外,-L 是指定一个库的座位路径。-l 指定库。

所以你需要 -L/usr/lib64/ -lpkcs11

于 2016-05-10T00:39:04.067 回答
0

我认为您的错误源于您的程序具有正确的标头(函数定义),而不是所述函数的实现。在开始使用 DLL 中实现的 PKCS#11 函数(在您的情况下为 opensc-pkcs11.so)之前,您实际上必须加载它。

我不是在 unix 系统中加载 DLL 的专家,但我认为应该可以解决问题。

附带说明一下,我强烈建议您在调用 C_Initialize 之后始终调用 C_Finalize(...)。

祝你好运 !

于 2016-05-10T14:55:58.523 回答