當運行一個opencv項目,一些dll需要在exe路徑,或在計算機的路徑。opencv庫加載(C++)
- 在什麼時候該dll被加載(靜態時間?)
- 其中OpenCV的源代碼的DLL加載?搜索在OpenCV的源「的LoadLibrary」給了零個結果...
編輯: 創建OpenCV的項目時,我添加的鏈接屬性的.lib文件。執行時,exe搜索相應的dll文件。我的問題是在opencv源代碼中的位置(我猜是.lib文件的源代碼)是加載dll文件的行。
感謝
轄
當運行一個opencv項目,一些dll需要在exe路徑,或在計算機的路徑。opencv庫加載(C++)
編輯: 創建OpenCV的項目時,我添加的鏈接屬性的.lib文件。執行時,exe搜索相應的dll文件。我的問題是在opencv源代碼中的位置(我猜是.lib文件的源代碼)是加載dll文件的行。
感謝
轄
1.at該dll被加載什麼時間(靜態時間?)
在 'DLL' 的 'd' 代表 '動態'。所以這意味着一個DLL在運行時加載,絕對不是在'靜態時間'。
2.在opencv源代碼中的哪個地方加載了dll?在opencv源代碼中搜索「loadLibrary」會得到零結果...
這將是動態鏈接器/加載器。現在我很長一段時間沒有爲Windows寫任何東西,所以我不確定dll是否延遲加載。在任何情況下,當您構建項目(.exe或.dll,無關緊要)時,編譯器會在最終的.exe文件中嵌入類似於「哦,順便說一句,我需要使用opencv.dll」的通知或.dll文件。
因此,當您運行.exe文件(或者當您的.dll被另一個程序加載時)時,加載程序會看到此通知並在某處查找opencv.dll(即在當前目錄或您的PATH環境變量)。
這一切都沒有你或任何人不得不打電話像loadLibrary
。因爲你已經明確地告訴你的編譯器你的程序依賴於opencv.dll,並且編譯器對開發人員來說很好,所以它會生成必要的代碼(如「機器代碼」,在.exe或.dll中)爲你加載庫。
loadLibrary
主要用於不希望程序明確依賴給定dll的情況(即,如果dll無法訪問,仍然希望程序運行),但是您希望將其作爲模塊(如果可用)。考慮將功能擴展到核心程序的插件。
OpenCV的dll文件在執行時立即加載。你可以通過一個簡單的程序來測試,只需要一個簡單的程序即可,如果所需的opencv dll文件不存在,即使是一個簡單的程序也不會運行。
與靜態鏈接的不同之處在於,如果靜態鏈接,庫將被插入到可執行文件中,並且不需要使用軟件分發任何opencv庫文件。
它們可能在可執行文件的[import section](http://msdn.microsoft.com/en-us/magazine/cc301808.aspx)中引用,並且會在程序啓動時加載。 – Michael
對於問題2:每個opencv頭文件中的「CV_EXPORTS」都會給出提示。 – William