2010-10-12 115 views
3

我試過在沒有運氣的情況下搜索一個很多(可能是因爲我沒有使用正確的技術術語)。我的問題主要是關於鏈接靜態庫,編譯和部署。在詳細介紹之前,我的可執行文件在我的系統上編譯得很好;主要問題是如何將這些解決方案部署爲其他人的工作解決方案。我已經寫了一個基本的使用OpenCV靜態庫的C++圖像處理exe文件(我使用項目>屬性>鏈接器>在VC++中鏈接這些文件>添加了附加的依賴關係,作爲標準)。我通過設置VC++選項指向正確的包含文件進行編譯...基本上,它都編譯得很好。我現在希望能夠在另一臺PC上部署它。我知道我需要發佈版本的exe +靜態庫...還有其他什麼?使用外部庫的OpenCV C++應用程序部署

一些庫依賴於使用libjpeg和libpng;我不認爲這些是標準的。此外,我已將鏈接器路徑設置爲相對靜態庫(例如resources/libs),因此它不依賴於系統,因此它知道在哪裏查找庫。基本的OpenCV數據結構工作正常(例如CvPoint),但是當我嘗試使用CvLoadImage加載圖像時,應用程序崩潰。如果我使用標準的ifstream fopen代替,我可以毫無問題地打開文件(但似乎無法將它帶入IplImage OpenCV image strut--有人知道如何做到這一點嗎?可能與IplImage-> imageData有關。) 。

非常感謝任何幫助。謝謝!

+0

我建議改變你的標題 - 這是誤導性的,不要不要使用便攜式詞語部署 – 2010-10-12 17:58:22

+1

您永遠不需要部署靜態庫(.lib),因爲它們已鏈接到您的可執行文件中。如果您使用動態庫(.dll),則需要部署。話雖如此,你有什麼錯誤? – 2010-10-12 18:00:47

+0

如上所述,libs將鏈接到.exe中,不需要單獨部署。您可以使用Dependency Walker來確保您不會無意中鏈接到任何非系統DLL(這需要與您的.exe一起部署)。 – Nate 2010-10-12 18:22:14

回答

1

靜態庫不必與應用程序一起分發(也不應該)。鏈接器將靜態庫內置到exe文件中。

OpenCV崩潰的原因是它無法找到libpng/libjpeg dll。 OpenCV並沒有將它們作爲靜態依賴鏈接,而是在運行時使用LoadLibrary/dlopen API。如果這些調用失敗,可能沒有很好的恢復,應用程序崩潰。如果包含libpng/libjpeg庫,則應解決問題。

另外要注意 - 一些.lib文件並不是真正的靜態庫,而只是一個薄層,它允許連接器在DLL中找到適當的函數並生成動態鏈接代碼,以便程序員不必做那是手工。你通常會看到.lib文件的大小非常小,並且你的應用程序會在exe啓動時發現它找不到DLL入口點。

+0

謝謝dark_charlie,我懷疑這是問題,因爲其他功能工作正常。我只能找到libjpeg.lib和libpng.lib。我是否將這些與其他庫一起添加,還是應該有單獨上傳的DLL?如果是這樣,我應該如何在VC++中引用它們?再次感謝。 – daz 2010-10-12 22:24:02

+0

你應該把DLL,libs永遠不會與應用程序分發。你不必在VC++中改變任何東西,只需將DLL複製到exe文件所在的文件夾即可。 – 2010-10-13 09:20:09

+0

好吧,從閱讀這裏就是我收集的內容: 1.我必須添加libjpeg.lib和libpng。lib項目屬性>鏈接器>輸入>其他依賴關係 2.在主CPP代碼中包含libjpeg.h和libpng.h。 3.將libjpeg.dll和libpng.dll複製到release exe目錄中。 我試過所有這些都沒有運氣。 – daz 2010-10-13 13:43:38