无法编译读取智能卡的ac应用程序

我正在尝试编译一个示例c应用程序,该应用程序正在使用pkcs#11查找令牌上的所有私钥,并打印其标签和ID,但会出现以下错误

/tmp/ccAqQ7UI.o: In function initialize': pkcs11_example1.c:(.text+0x8e5): undefined reference to C_Initialize' /tmp/ccAqQ7UI.o: In function `get_slot': 

这个例子来自这里

使用以下命令进行编译;

  `gcc pkcs11_example1.c -o slots -L /usr/lib/opensc-pkcs11.so` 

我不确定在-L之后我应该链接哪个库。 任何人都可以指导如何编译它,是否有一些库需要链接。

具有“C_”前缀的C_Initialize和其他60多个函数是PKCS#11规范中定义的cryptoki函数。 它们通常在HSM供应商提供的独立库中实现。 查看代码示例,我会说您需要直接链接PKCS#11库,或者您可以修改代码以在运行时使用LoadLibrary或dlopen动态加载PKCS#11库,然后通过C_GetFunctionList调用获取指向所有cryptoki函数的指针。 您还可以查看pkcs11-logger源代码 ,了解如何执行此操作的示例。

您提供的链接命令, gcc pkcs11_example1.c -o slots -L /usr/lib/opensc-pkcs11.so ,是错误的。

  • -L只接受路径,它被添加到搜索libs的路径中,但是/usr/lib是默认的,所以你根本不需要这个开关。

  • 你缺少-l ,它使用没有lib前缀或.so后缀的库名,所以看起来你需要-lopensc-pkcs11

因此,首先确保您的库文件确实是/usr/lib/libopensc-pkcs11.so (注意lib前缀!),可能跟随以下版本号。 然后更改构建选项,以便链接命令变为

 gcc pkcs11_example1.c -o slots -lopensc-pkcs11