看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
VictorTom:推:) 10/06 23:22
priv:VC就算都是2005,不同的更新版也會有不同的side by side dll 10/06 23:33
priv:所以會出現有不同版本的vcredist_x86 10/06 23:33
priv:老實說與其附一大包redist還不如static build... 10/06 23:34
priv:為了解決dll版本的問題弄了一個side by side conf 10/06 23:34
priv:結果卻完全失去了dll的原意...幾乎沒redist就一定不能跑 10/06 23:34
purpose:東西再好,太複雜太難入門也就沒人用了 10/06 23:34
littleshan:有時候是你沒辦法static build,比如你用了別人的 DLL 10/07 00:38
priv:的確,以前還做過把dll放到resource裡面 10/07 00:41
priv:設定delay load,runtime再解出來的...xd 10/07 00:42
hyper0310:謝謝:D 10/08 14:38