2016-05-28 48 views
4

我按照link的指示構建了庫。爲了將該庫鏈接到Visual Studio,我使用了下列方法,但它們都不能鏈接到我構建的.lib文件。將庫(.lib)鏈接到Visual Studio 2013項目

  1. 的Windows系統變量添加動態庫路徑(環境變量 - >路徑)

    • 設置爲; C:\ Users \用戶venushka \桌面\ libxbee3-的win32 \ lib中
  2. 的Visual Studio(包括標頭和源文件C++)

    • 配置屬性 - > C/C++ - >常規 - >附加包含目錄設置爲C:\用戶\ venushka \桌面\ libxbee3-win32的
  3. 鏈接庫

    • 個配置屬性 - >鏈接器 - >常規 - >附加庫目錄設置爲
    • C:\用戶\ venushka \桌面\ libxbee3-的Win32 \ lib中
  4. 添加對象庫文件的名稱

    • 配置屬性 - >鏈接 - >輸入 - >附加依賴我添加有作爲libxbee3.lib
  5. 。爲了連接目的我加入

    • 添加 - >現有項目(項目屬性)都.dll & .lib文件,但該東西也沒有任何區別仍然保持相同的錯誤。
  6. 最後我想補充

    #pragma comment (lib, "libxbee3.lib") 
    #pragma comment (lib, "libxbee3.dll") 
    

我得到它說,我無法成功鏈接庫無法解析的外部錯誤。任何幫助表示讚賞。

我附上截圖Screenshot

錯誤日誌

Error 1 error LNK2019: unresolved external symbol _xbee_setup referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj 
Error 2 error LNK2019: unresolved external symbol _xbee_shutdown referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj 
Error 3 error LNK2019: unresolved external symbol _xbee_conGetTypes referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj 
Error 4 error LNK2019: unresolved external symbol _xbee_errorToStr referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj 
Error 5 error LNK1120: 4 unresolved externals C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\Debug\xbeetest.exe 1 
+2

DLL不是構建過程的一部分,那麼爲什麼在你的指令集中引用它們呢?只有在運行程序時才使用DLL,而不是在構建它時使用。 – PaulMcKenzie

+0

@PaulMcKenzie yap。你是正確的,我刪除了導入DLL謝謝。但我仍然無法編譯該程序。 – VenushkaT

回答

6

您已經覆蓋了大多數的基本問題和"usual" suspects在OP,如庫的位置,名稱等

而且問題可能包括:

  • 混合x86和x64建立
  • 的符號被從DLL導出(可以用dumpbin /exports檢查)
  • 名稱重整(雖然這應該是在這裏很好,這是一個C API)
  • 不相容符號出口註解(混合GCC和MSVC)

鑑於提供的示例代碼(在com連接ments),鏈接到構建的lib和dll,我已經能夠驗證(使用VS2015更新2);

  • 的符號被從DLL導出(因爲你已經把它)
  • 名稱不出現錯位,該extern "C"似乎是正確應用
  • 和簡單#define EXPORT __declspec(dllimport)列入前加入添加了「xbee.h」文件。

鑑於上述和x64 lib和dll,我可以編譯和鏈接示例代碼。

It 留下x86與x64目標。默認情況下,VS嚮導將x86定位到命令行應用程序。使用這些默認值,我可以重現錯誤。

要添加x64平臺;

  1. 打開「配置管理器」(生成>配置管理器)
  2. 從「活動解決方案平臺」下拉菜單,從下拉針對新平臺
  3. 選擇
  4. 選擇64(可選)選擇設置從x86平臺複製(這可以在以後根據需要進行修改)
  5. 勾選「創建新的項目平臺」,然後單擊確定

添加後,在構建菜單中選擇x64平臺目標並重建示例應用程序。

如果x86平臺是預期的目標,libxbee3庫將需要重新構建,以針對x86平臺而不是x64平臺。

附註; VS2015對不匹配的x86和x64目標發出警告(在更新2上進行了測試)。


關於不兼容的符號導出註釋。

你在賞金筆記中提到你;

That library was make from the source files of git (make GNU for windows)

最有可能的是,這裏使用的編譯器是gcc。這在鏈接的代碼庫中支持,用於導出符號的屬性是;

#define EXPORT __attribute__((visibility("default"))) 

一種用於實現類似的結果,__declspec(dllexport)的MSVC符號搜索,產生任何結果。

要從dll導入符號(並使用它們是您的項目),MSVC編譯器需要相應的__declspec(dllimport)上所需的符號。

這是典型的(對於MSVC)庫側預處理器塊;

#ifdef BUILDING_MY_DLL 
#define MY_DLL_API __declspec(dllexport) 
#else 
#define MY_DLL_API __declspec(dllimport) 
#endif 

上述塊通常包含在標題中,導出的符號標記爲MY_DLL_API。在構建庫時,定義BUILDING_MY_DLL是在命令行或某些內部包含的頭文件中定義的。在構建exe(或客戶端)時,未定義BUILDING_MY_DLL,因此符號標記爲導入。

要解決導入/導出符號問題,有一些基本方法。

第一個是修改代碼並用MSVC重建DLL,並使用上面的dllexportdllimport;

#ifdef BUILDING_LIBXBEE3 
// define BUILDING_LIBXBEE3 on the command line when building the dll... 
#define EXPORT __declspec(dllexport) 
#else 
#define EXPORT __declspec(dllimport) 
#endif 

第二,提取所要求的功能特徵(和類型),成私有頭,要使用的並用正確的dllimport單獨註解它們。

extern "C" { 

// ... other definitions required 

__declspec(dllimport) 
xbee_err xbee_setup(struct xbee **retXbee, const char *mode, ...); 

} // extern "C" 

第三種是隻定義已經作爲__declspec(dllimport)EXPORT,確保列入任何庫的頭文件之前定義出現。基本上添加;

#define EXPORT __declspec(dllimport) 

爲一個文件,如「stdafx.h中」任何包含「xbee.h」

+0

非常感謝你的回答。但是我覺得它太複雜,難以理解。但我試圖編輯我的代碼,我從你的答案中學到了什麼。但我仍然得到相同的錯誤。你能不能請我提一下我在那裏做錯了什麼。謝謝。 https://drive.google.com/open?id=0BzXV5sHD5fcrWWZWNXJPUWIwMzg – VenushkaT

+0

我在你上傳的樣本採取一看,我也明確的答案一點 - 你只真正需要的'的#define EXPORT __declspec (dllimport)'部分。我無法從源碼建立圖書館。你沒有提到你使用的是什麼構建環境,但是minnow-w64不適用於master或windows分支。我沒有cygwin來嘗試。你可以上傳的DLL和lib,我可以嘗試從那裏診斷它。 – Niall

+0

可以請你點下,謝謝你。 https://drive.google.com/open?id=0BzXV5sHD5fcrWVRfN21QUDByM0U – VenushkaT

0

錯誤的可能原因:

  1. 有沒有包含在xbeetest.cpp頭
  2. 你將dll文件包含到項目中,但不包括鏈接過程。
  3. 鏈接器出現故障。

可能的方法:

  1. 使用LoadLibrary()
  2. 不使用的DLL,只是使用整個源代碼
+0

可否請您使用代碼解釋它。可能的方法我沒有得到它。謝謝。 – VenushkaT

+1

什麼是「#使用」?這是託管代碼中的事情,與本地C++無關。在這種情況下無關緊要,他將鏈接到本地​​庫。你的回答也不是特別有用,因爲它和鏈接器已經給他的錯誤信息一樣通用。 –

+0

#using用於包含一個dll文件。 –

0

此之前可能是不完整的答案 - 但讓我們從分析你有你的庫裏面是什麼開始。

How to See the Contents of Windows library (*.lib)

可以運行DUMPBIN /符號libxbee3.lib 看到的.lib暴露了什麼功能的符號。

Visual studio 2015 run-time dependencies or how to get rid of Universal CRT?

還記得「__imp_」功能前綴應該是被導入/導出從.DLL - 可能是你調用轉換爲不正確的地方 - 所以你需要確保對__declspec(DLLEXPORT) dll側和__declspec(dllimport)在調用方,導出的函數條目從__imp_開始。

相關問題