使用 PKCS#11 的 C 应用程序链接错误 API
Linking error for a C application using PKCS#11 API
我正在尝试编译一个仅执行 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 命令显示以下 so 路径
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'
请指导如何解决这个问题
您使用的是什么包含文件?
#include <assert.h>
可能还需要
#include <pkcs11.h>
另外,-L是指定一个库的搜索路径。 -l 指定库。
所以你需要 -L/usr/lib64/ -lpkcs11
我认为您的错误源于您的程序具有正确的 headers(函数定义),而不是所述函数的实现。
在开始使用 DLL 中实现的 PKCS#11 函数之前(在您的情况下为 opensc-pkcs11.so),您实际上必须加载它。
我不是 unix 系统中 DLL 加载的专家,但我认为 this 应该可以解决问题。
附带说明一下,我强烈建议您在调用 C_Initialize.
之后始终调用 C_Finalize(...)
祝你好运!
我正在尝试编译一个仅执行 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 命令显示以下 so 路径
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'
请指导如何解决这个问题
您使用的是什么包含文件?
#include <assert.h>
可能还需要
#include <pkcs11.h>
另外,-L是指定一个库的搜索路径。 -l 指定库。
所以你需要 -L/usr/lib64/ -lpkcs11
我认为您的错误源于您的程序具有正确的 headers(函数定义),而不是所述函数的实现。 在开始使用 DLL 中实现的 PKCS#11 函数之前(在您的情况下为 opensc-pkcs11.so),您实际上必须加载它。
我不是 unix 系统中 DLL 加载的专家,但我认为 this 应该可以解决问题。
附带说明一下,我强烈建议您在调用 C_Initialize.
之后始终调用 C_Finalize(...)祝你好运!