配置第三方庫如Opencv,或者軟件開發商提供的SDK時,一般需要配置三個文件:
頭文件(.h),引入庫(.lib)文件(也稱“導入庫文件”),動態鏈接庫(.dll)文件
下面以度申科技的相機sdk配置為例,簡述一下這三個文件的配置方法。
在開發過程中筆者參考了幾篇博客,最后在廠商技術人員的幫助下,終於弄清楚了第三方庫的配置方法,在此表示感謝。
參考文章:
靜態庫和動態庫的區別,lib文件和dll文件的配置方法_Sean_新浪博客 http://blog.sina.com.cn/s/blog_6dd65c6f0100vveq.html
VS2005 使用/導入lib 、 dll庫 - pacewalker的專欄 - CSDN博客 http://blog.csdn.net/pacewalker/article/details/7236701
關於屬性表可參考下面文章:
OpenCV在Visual Studio中的屬性表配置方法(通用)_百度文庫 https://wenku.baidu.com/view/4eb66733ba0d4a7303763a18.html
1.配置頭文件的方法
1)在屬性表中添加附加包含目錄絕對路徑。
2)在屬性表中添加附加包含目錄相對路徑
上圖中的路徑是SDK的安裝路徑,即絕對路徑,如果想一勞永逸,比如想讓這個項目文件夾拷貝到其他沒有裝SDK的機器上仍能夠運行,就把.h文件直接拷貝到項目路徑下。這時候就要設置頭文件的相對路徑,來個例子:
頭文件目錄如下:
屬性表中設置的相對路徑如下:
VS會在項目路徑下搜索include文件夾,之后按照配置的相對路徑就能找到頭文件。
3)在項目頭文件中直接用include語句引入,無需配置屬性表
絕對路徑表示如下:
相對路徑表示如下:
#include "../../../library/Visual C++/include/DVPCamera.h"
其中一個"..\"表示一個上一階目錄,有三個"..\"表示當前目錄再往前三個目錄,所以他的意思就是調用當前目錄再往前三個目錄下的inclued文件夾中的頭文件。頭文件實際的路徑是
D:\Program Files (x86)\DVP2 SDK\library\Visual C++\include
項目目錄為
D:\Program Files (x86)\DVP2 SDK\Sample\VC++\MultipleCamera
因此從MultiCamera向上三層是DVP2 SDK,所以從DVP2 SDK目錄下的library中層層向下找到目標頭文件。這種寫法是因為sdk會被安裝到那個目錄下是不確定的,但是sdk目錄之間的層級關系是固定的。
下面的情況相對路徑可表示為(MultiCamera為項目目錄):
#include "include/subdirectory/DVPCamera.h"
也可以寫作
#include "include\subdirectory\DVPCamera.h"
實際測試發現include語句中‘\’和‘/’沒有區別,都能通過編譯。
2、引入庫.lib文件配置方案
與頭文件配置類似,引入庫也分相對路徑和絕對路徑。
1)在屬性表中添加附加庫目錄和庫文件名稱
絕對路徑:
相對路徑:
其中一個"..\"表示一個上一階目錄。
添加lib文件名:
在鏈接器-輸入-附加依賴項中添加文件名即可。
2)在項目cpp文件中直接用#pragma comment語句引入,無需配置屬性表
使用語句添加引入庫的好處就是無需配置多個屬性表,
不管是debug模式還是release模式,不管是64位還是32位,幾行代碼通吃。
相對路徑:
#ifdef _M_X64
#pragma comment(lib, "../../../VC++/DVPCamera64.lib")
#else
#pragma comment(lib, "../../../VC++/DVPCamera32.lib")
#endif
絕對路徑:
#ifdef _M_X64
#pragma comment(lib, "D:/Program Files (x86)/DVP2 SDK/library/Visual C++/lib/x64/DVPCamera64.lib")
#else
#pragma comment(lib, "D:/Program Files (x86)/DVP2 SDK/library/Visual C++/lib/x86/DVPCamera.lib")
#endif
此處注意,直接從地址欄復制的路徑中分隔符是‘\’,而comment指令中的分隔符是‘/’,需要做一下修改,否則會報錯。
或者也可以用‘\\’,即
#pragma comment(lib, "D:\\Program Files (x86)\\DVP2 SDK\\library\\Visual C++\\lib\\x64\\DVPCamera64.lib")
另外,如果你使用了#pragma comment 語句,記住把屬性表里的配置項刪除掉。
如果使用了#pragma comment 語句,但是屬性表里lib庫只給了文件名而配置給庫路徑,也會報錯。
兩者是在編譯鏈接時系統都會查找的,任何一個有問題就會報錯。
3、動態鏈接庫文件
根據文章:
靜態庫和動態庫的區別,lib文件和dll文件的配置方法_Sean_新浪博客 http://blog.sina.com.cn/s/blog_6dd65c6f0100vveq.html
在程序運行時系統會自動搜索相應的dll文件,搜索的順序依次分別為:
1、程序的執行目錄(exe目錄)
例如:F:\VC++\SourceCode\Lesson19\Dll1\Dll1\debug
1、當前目錄;
例如:F:\VC++\SourceCode\Lesson19\Dll1\Dll1
2、系統目錄;
依次是:C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS
3、path環境變量中所列出的路徑。
最穩妥的方式就是把dll文件放到項目目錄Debug或Release文件夾下,而且不能有子目錄。下面這種方式就是把dll文件放到子目錄下,結果會報錯。
否則會報錯如下:










