在 Visual Studio C++ 專案中使用LabWindows™/ CVI™ 函式出現 error:LNK2019

更新 Jun 22, 2021

產品資訊

軟體

  • LabWindows/CVI Base
  • LabWindows/CVI Full
  • Microsoft Visual Studio

問題敘述

我嘗試在Visual Studio C ++專案中使用LabWindows / CVI函式,但是當我嘗試編譯程式碼時,會收到以下報錯訊息:

error LNK2019: unresolved external symbol

解決方案

為了在Visual Studio C++程式中編譯LabWindows/CVI函式,首先必須使用導入庫將函式構建到動態鏈接庫(.dll)中,然後將導入庫(.lib)鏈接到C++專案。要將函式構建到DLL中並避免鏈接錯誤,請完成以下步驟:
  1. 如果包含這些功能的儀器驅動程式尚未加載到LabWindows/CVI中,則需要轉到Instrument>>Load的方法加載它。在打開的對話框中,找到對應的.fp檔案,然後單擊Load 。
  2. 通過轉到File>>Open>>Function Tree (* .fp)來打開功能樹編輯器。在打開的對話框中,選擇所需的.fp檔案,然後單擊Load 。
  3. 通過轉到Options>>Create DLL Project創建DLL專案。選擇專案的名稱和路徑,然後單擊Save 。類似於以下的對話框將彈出一條消息,詢問是否要立即加載DLL專案。單擊Yes
  1. 在構建DLL之前,您將需要配置一些構建設置。首先通過轉到Build>>Target Type並確保Dynamic Link Library旁邊有一個複選標記來設置構建目標類型。通過轉到Build>>Configuration並確保Release旁邊有一個選中標記,還將專案設置為Release模式。
  2. 通過Build>>Target Settings,然後更改以下設置:
    1. Run-time support選項更改為Full run-time engine,如下圖所示
  1. 通過單擊Type Library並取消選中Add type library resource to DLL更改類型庫設置。如果不取消選中此選項,則在嘗試構建時可能會遇到類型定義錯誤,類似於Definitions for these types could not be found.

然後單擊OK退出兩個窗口。
  1. 在LabWindows/CVI 2012或更早版本中生成DLL,選擇Build>>Create Release Dynamic Link Library 。在LabWindows/CVI 2013中,選擇Build>>Build 。這將創建一個動態鏈接庫(.dll)和一個包含您所需要使用的LabWindows/CVI函式的導入庫(.lib)。現在我們就可以將導入庫鏈接到Visual Studio專案。
  2. 打開您的Visual Studio C++專案,然後轉到Project>>Properties。在Properties窗口中,轉到Configuration Properties>>C/C++>>General。單擊Additional Include Directories,然後在列表中選擇<Edit...>
  1. 在打開的對話框中,單擊New Line按鈕,添加包含頭檔案的目錄,然後單擊OK 。
  1. 導航到Configuration Properties>>Linker>>Input。單擊Additional Dependencies,然後單擊出現的箭頭並選擇<Edit...>
  1. 在打開的對話框中,將導入庫的路徑添加到Additional Dependencies中。
  1. 編譯Visual Studio專案,此時應解決鏈接錯誤。如果仍然看到鏈接錯誤,則可能是專案依賴於多個LabWindows/CVI函式庫。在這種情況下,您將要對其他庫重複這些步驟。

相關資訊

如果您要使用的功能已經捆綁到帶有導入庫的DLL中,則可以跳過步驟1到6。

如果仍然存在鏈接錯誤,則很可能是name mangling的問題所導致。 C++語言允許您覆蓋某些功能(例如,面向對象編程中的方法)。為了解決某些名稱衝突,C ++編譯器添加名稱修飾以便使名稱唯一化。
因此,當您在C++程式中調用C庫時,C++編譯器需要知道它不需要修改名稱。如果是這種情況,C++編譯器創建的名稱與C程式碼中的名稱不同,並提示鏈接錯誤。
為了解決該問題,您需要在與.c檔案相關的頭檔案(.h)中添加以下程式碼。
#ifdef __cplusplus
extern "C" {
#endif
    /* The functions you want to keep the same in C and C++ */
#ifdef __cplusplus
}
#endif