Re: [問題] vc++ 2008開發的程式不能在另外一台電렠…
※ 引述《starzodiac (永不補考)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenCV
: 問題(Question):最近要準備demo系統 但現在卡在沒有辦法移植到另外一台
: 電腦 執行會出現sxstrace錯誤 上網爬文 原來是沒有安裝VC++ 發現可以用vcredist_x86
: 來解決問題 不過安裝了VC++ 2008 SP1的版本還是不行 想請教大大 是我哪裡錯了
你...沒講你的解決過程啊 (中間的細節很重要!)
看到 sxs 就想到大概是 manifest 沒有處理好
VC2008 產生的 exe 或 dll 會使用一個 manifest 文件來描述程式或函式庫的相依性
這個 manifest 可以嵌入到執行檔中,也可以分離出來,但一定要存在
找不到的話就無法執行程式
所以若要確保你寫的程式可以在其它沒裝 VC 的電腦上跑
要確定以下幾件事:
1. 對 VC runtime 使用 static link
這應該是最快的方法,但不幸的是若你使用了其它的 DLL
這些 DLL 應該會相依於 dynamic linked C runtime
然後 linker 會跟你抱怨 symbol redefinition
但是問題還是沒解決 (因為你還是需要 VC runtime DLL 給其它的 library 用)
2. 或是在目標電腦上安裝 vcredist_x86
要用執行檔安裝,不可以只複制 dll 不然它會找不到 manifest
3. 如果你是編成 debug mode
那要去 VC 的目錄下找 Debug_NonRedist 版本的 VC runtime
因為 debug 版的 VC runtime library 在除錯資訊中有包含它自己的原始碼
所以這個 VC runtime 在版權上是禁止散布的,只能自行 debug 用
複製時記得連同 manifest 檔一起複製
4. 所有你使用到、編成 DLL 的 library (比如說 OpenCV)
都要一併複製 manifest 檔案到目標電腦上
5. 你要確保所有 DLL 的 manifest 其相依的 VC runtime 是標示為同一個版本
即使同樣是 VC9 runtime library 也有很多不同的小版本
如果 DLL 相依在不同版本的 VC runtime 會滿麻煩的
可能可以跑,也有可能完全不能動
6. 有的 DLL 會把 manifest 嵌入到自己的檔案內容中
如果這些 DLL 的 manifest 相依在不同版本的 VC runtime library 而導致問題
那你需要把 DLL 裡面的 manifest 分離出來,寫入正確內容後再嵌入
: 還是有不用安裝VC++ 就可以解決這問題的其他方法?
: 還有我想要問 我的程式有使用到OpenCV的函數庫 但是在別台電腦上沒有辦法執行
: 有沒有其他的辦法可以像安裝vcredist_x86類似的程式
: 還是說一定要跟之前一樣 安裝VC++ 2008 然後建置release&debug...等步驟?
當然可以用 OpenCV
只是如果 OpenCV 也是編成 DLL
那麼你也要確定 DLL 是連結到相同版本的 VC runtime
manifest 內容正確而且也有複製到別台電腦上
如果你看不太懂前面那一大段到底在講什麼
那以下是個實用的建議:改用 VC 2010、安裝 OpenCV for VC 2010
因為 VC 2010 已經捨棄 manifest 這個智障設計了
所以應該不會出現 sxstrace 之類的問題
但是另一台沒裝 VC 的電腦還是要安裝 vcredist_x86
或是直接把 msvcr100.dll 及 msvcp100.dll 放到執行檔目錄下
(這兩個檔案都可以在 VC 2010 的安裝目錄下找到)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.70.176
推
10/06 23:22, , 1F
10/06 23:22, 1F
→
10/06 23:33, , 2F
10/06 23:33, 2F
→
10/06 23:33, , 3F
10/06 23:33, 3F
→
10/06 23:34, , 4F
10/06 23:34, 4F
→
10/06 23:34, , 5F
10/06 23:34, 5F
→
10/06 23:34, , 6F
10/06 23:34, 6F
推
10/06 23:34, , 7F
10/06 23:34, 7F
→
10/07 00:38, , 8F
10/07 00:38, 8F
推
10/07 00:41, , 9F
10/07 00:41, 9F
→
10/07 00:42, , 10F
10/07 00:42, 10F
推
10/08 14:38, , 11F
10/08 14:38, 11F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):