2016-08-05 550 views
0
#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」,但似乎我不能使用它們。

我不知道如何解決它。

+6

你需要*鏈接*正確的庫? [檢查參考](https://msdn.microsoft.com/en-us/library/windows/desktop/aa379479(v = vs.85).aspx)。 –

+2

哪個庫定義了這些函數?頭文件是'winscard.h',但頭文件只聲明函數;它沒有定義它們。某處有一個定義這些函數的庫或DLL。你需要指定它。也許用選項'-L/path/to/scard/lib -lscard'來指定目錄和庫名稱 - 我在猜測正確的名稱,但是你需要知道正確的名稱並使用它以及它的安裝位置並使用它。 –

+0

明白了。非常感謝你, –

回答

0

包含一個頭文件通常只是通知你的翻譯單元(你在這種情況下程序)存在的某些事情,級別比可以被編譯的代碼,

要真正使用那些東西,你需要除了弄清楚它們的存在以外,還需要在可執行文件中實際包含它們的代碼。

這通常是鏈接階段的責任,並且根據Microsoft documentation,這些函數的代碼可以在winscard.lib/.dll中找到。您需要修改您的項目,以便這些庫包含在您的構建中。

相關問題