如何解决C程序中'未定义的引用'?
问题描述:
#include <stdio.h>
#include <stdlib.h>
#include <winscard.h>
#include <wintypes.h>
int main(void){
SCARDCONTEXT hContext;
SCARDHANDLE hCard;
DWORD dwActiveProtocol;
LONG rv;
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM,NULL,NULL,&hContext);
rv = SCardConnect(hContext,"Reader X", SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
printf("Hello world!\n");
}
有这样的错误:如何解决C程序中'未定义的引用'?
test.c:(.text+0x2e): undefined reference to `SCardEstablishContext'
test.c:(.text+0x5b): undefined reference to `SCardConnect'
xcollect2: error: ld returned 1 exit status
的功能都包含在“winscard.h”,但似乎我不能使用它们。
我不知道如何解决它。
答
包含一个头文件通常只是通知你的翻译单元(你在这种情况下程序)存在的某些事情,级别比可以被编译的代码,
要真正使用那些东西,你需要除了弄清楚它们的存在以外,还需要在可执行文件中实际包含它们的代码。
这通常是链接阶段的责任,并且根据Microsoft documentation,这些函数的代码可以在winscard.lib/.dll
中找到。您需要修改您的项目,以便这些库包含在您的构建中。
你需要*链接*正确的库? [检查参考](https://msdn.microsoft.com/en-us/library/windows/desktop/aa379479(v = vs.85).aspx)。 –
哪个库定义了这些函数?头文件是'winscard.h',但头文件只声明函数;它没有定义它们。某处有一个定义这些函数的库或DLL。你需要指定它。也许用选项'-L/path/to/scard/lib -lscard'来指定目录和库名称 - 我在猜测正确的名称,但是你需要知道正确的名称并使用它以及它的安装位置并使用它。 –
明白了。非常感谢你, –