精華區beta C_and_CPP 關於我們 聯絡資訊
我的程式是用 VC 2008 編的 現在我要把執行檔打包送出 可是在 target 上一直無法執行 我有在 target 上用 DependencyWalker 看 沒有缺 dll 但是一直出現: Error: The Side-by-Side configuration information for "檔名" contains errors. 檔名裡是我自己用 VC 編出的 binary 我試過很多方法了 包括複製 manifest 到目錄裡 都沒用 裝 redist.exe 有機會解決這個問題 可是這個方法需要管理者權限, 不是每台電腦都有裝 我也有看過 MSDN 上關於 XCopy 的方法 一樣沒用 .... 我想問到底怎樣發佈才能正常執行 PS: 也許有人會建議我改用 MinGW, 不過有些組件 MinGW 無法移植 因此不考慮換其他 toolchain -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.59.213.3
VictorTom:Project->Property->Config Properties->C++->Code Gen 07/03 22:01
VictorTom:Runtime Lib => 選沒有dll的那兩個的其中一個試試.... 07/03 22:02
VictorTom:Debug版就選 /MTd, Release版就選 /MT, 猜是這個問題:) 07/03 22:03
VictorTom:這個預設模式是小弟我很度爛VC++2003以後版本的一點.... 07/03 22:04
VictorTom:這問題連build dll也會遇到; 不然就像您說的裝redist了 07/03 22:05
zlw:如果有用顯示連結呼叫DLL,在Dependency Walker看不出相依性 07/03 22:06
legnaleurc:拋棄 dll 我就不能用 plugin ... 07/03 22:10
legnaleurc:而且弄成 static link 只能算 work around 吧... 07/03 22:11
legnaleurc:然後這和手動呼叫DLL 沒啥關係, 因為連 startup 都不行 07/03 22:12
zlw:我只會簡單的偵錯,在懷疑有錯誤想設中斷點的地方,都加一行 07/03 22:26
zlw:類似cout<<"bp1"; 然後不能執行的電腦用OllyDbg搜尋這些字串 07/03 22:26
zlw:下中斷點,跑反組譯的指令單步偵錯看是哪部份問題。 07/03 22:27
zlw:另外你說的 side-by-side 錯誤,應該是 dep. walker 給的,那 07/03 22:28
zlw:直接執行會出現的錯誤是寫怎樣呢? 07/03 22:29
legnaleurc:這個應用程式設定不正確 重新安裝...可以解決問題 07/03 22:51
legnaleurc:我不是用中文版OS,不過應該是這樣 07/03 22:51
legnaleurc:基本上debuger應該也沒用...因為根本沒有執行 07/03 22:53
VictorTom:Err~請問小弟說的那個方法重build binary沒用嗎!? 07/03 23:17
VictorTom:不只.exe檔喔, 有自己建的.dll也都要這樣....@_@" 07/03 23:35
zlw:http://www.thecodeway.com/blog/?p=21 根據這篇文章,應該就 07/03 23:36
zlw:是dll的問題,他提供的第三個方法,複製『對應』的dll你試過嗎 07/03 23:36
VictorTom:啊~~我看懂了....Orz 可以的話是z大的方法三比較好.... 07/03 23:42
VictorTom:但是, 我記得用manifest這東西, 以後VC sp一裝什麼的, 07/03 23:43
VictorTom:很容易只是因為個dll version的問題又讓程式不能run了. 07/03 23:44
VictorTom:用static link除了程式會變肥一點, 目前也想不出有什麼 07/03 23:44
VictorTom:壞處@_@" 事實上小弟反而覺得, 除非是OS/DX這類平台保證 07/03 23:45
zlw:不能在編譯的時候關掉這個功能嗎,沒別台電腦可以測 07/03 23:46
VictorTom:的.dll, 小弟我寧可都用static link來處理這個問題Orz 07/03 23:47
legnaleurc:我在本文裡就有提到我有複製 manifest 07/04 00:03
legnaleurc:dependency walker 也顯示沒有缺失的 dll 07/04 00:03
legnaleurc:問題在於我無法載入那些複製的 dll 07/04 00:04
legnaleurc:然後,不用dll我就不能用plugin,不是不想用,是不能用 07/04 00:04
> -------------------------------------------------------------------------- < 作者: zlw (www.eJob.gov.tw) 看板: C_and_CPP 標題: Re: [問題] 發佈程式到其他電腦上 時間: Sat Jul 4 03:16:14 2009 ※ 引述《legnaleurc (CA)》之銘言: : 我的程式是用 VC 2008 編的 : 現在我要把執行檔打包送出 : 可是在 target 上一直無法執行 : 我有在 target 上用 DependencyWalker 看 : 沒有缺 dll : 但是一直出現: : Error: The Side-by-Side configuration information for "檔名" contains errors. : 檔名裡是我自己用 VC 編出的 binary : 我試過很多方法了 : 包括複製 manifest 到目錄裡 : 都沒用 : 裝 redist.exe 有機會解決這個問題 : 可是這個方法需要管理者權限, 不是每台電腦都有裝 : 我也有看過 MSDN 上關於 XCopy 的方法 : 一樣沒用 .... : 我想問到底怎樣發佈才能正常執行 : PS: : 也許有人會建議我改用 MinGW, 不過有些組件 MinGW 無法移植 : 因此不考慮換其他 toolchain 這問題還蠻有趣的,剛試了一下有成功,做了點紀錄。 小記: 1. 預設狀況下,VC的專案設定是會產生 manifest 檔。如果改成不產生此檔執行時 會有問題,現在變成無論如何都要有?? 2. 預設值會將 manifest 內嵌進 exe,所以不需要外接。有內嵌時,外接會被無視。 3. 專案設定改成外接後,manifest 需要跟執行檔同名放一起, 如 1.exe 與 1.exe.manifest。找不到時會有 R6034 這類錯誤。 4. 承上,有錯誤時到事件檢視器去看看,有時會有比錯誤視窗更詳細的說明。 -- 改成 portable 流程: 簡單的例子,用 C 的 Hello World,再 VC 編譯成 /MD,故需要 msvcr90.dll (數值為假設,可能相異)。 專案設定->資訊清單工具->輸入和輸出->內嵌資訊清單=否,故 build 後會輸出 1.exe 與 1.exe.manifest。 打開 1.exe.manifest,刪掉 publicKeyToken 設定,因為 1.exe.manifest 裡面寫 name="Microsoft.VC90.CRT",所以這代表了預設會到 %WinDir%/WinSxS 裡去搜尋 Microsoft.VC90.CRT 對應檔案 在我電腦的是 x86_Microsoft.VC90.CRT_略_9.0.21022.8_x-ww_略.manifest 因為有安裝 VC,所以還有另外一個 Microsoft.VC90.CRT.manifest 在 redist 目錄裡。 將 Microsoft.VC90.CRT.manifest 複製到 1.exe 所在, 同樣刪掉 publicKeyToken 那行設定。 則只要 1.exe + 1.exe.manifest + msvcr90.dll + Microsoft.VC90.CRT.manifest 放在同一個目錄就能執行。 -- (註:可用 Resource Hacker 之類的軟體開 exe 來檢查其有無內嵌 manifest。可用 process monitor 軟體監視 exe 檔被執行後,搜尋 dll 的動作是到哪去。 可用 everything 快速找出電腦上 dll、manifest 相關檔案) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.130.199
zlw:參考資料:http://davidlenihan.com/2007/07/winsxs.html 07/04 03:21
補充: 查詢 1.exe 的 manifest 得到某 dll 的 name 如 Microsoft.VC90.CRT 之後 搜尋 %windir%\winsxs\policies 查看是否有無針對此dll的政策設定 由policies規定版本去找 %windir%\winsxs\Manifests 裡有無該dll的 manifest 若能找到,則接著到winsxs裡找政策規定版本的dll。 winsxs沒有找到時,才到1.exe同目錄下找該dll的manifest及dll。 當想要限定 1.exe 使用特定版本的 dll,卻怕目標電腦 policies 規定的 dll 是更新版時,上文「改成 portable 流程」裡的方法可避開winsxs的policies ※ 編輯: zlw 來自: 124.8.130.199 (07/04 05:46)
legnaleurc:感謝,正在測試中 07/04 17:20
legnaleurc:後來我利用 resource editor 把 public token 去掉 07/06 12:24
legnaleurc:結果變成 checksum 不合 07/06 12:24
legnaleurc:QQ 07/06 12:25
zlw:你是說直接改.exe或.dll,把裡面的metadata改掉後,再執行時 07/06 12:46
zlw:(打錯,是 manifest,想到 .NET 去了) 07/06 12:47
zlw:PE header內的checksum錯誤?CFF Explorer軟體裡的Rebuilder功 07/06 12:49
zlw:能,裡面有Update Checksum,可以試試,這套軟體也可編輯就是 07/06 12:51
zlw:不過你的程式該不會有用到 *.snk 檔做 RSA 檢驗吧? 07/06 12:52
legnaleurc:呣,它後來說我缺 comctl32.dll ... 不過我有附啊... 07/06 17:51
> -------------------------------------------------------------------------- < 作者: janice001 (真理) 看板: C_and_CPP 標題: [問題] visual studio 2005 編譯的程式 時間: Tue Jun 1 14:39:09 2010 我是使用 visual studio 2005 我在debug資料夾找到編譯出來的程式 但是我傳給別人的時候 對方卻無法使用 請問我應該怎麼做? 有同學說 對方電腦應該也安裝同樣的framwork 請問各位前輩 有沒有比較好的作法 @@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.126.123.103
clanguage:把硬碟傳給他 06/01 15:48
nowar100:我來的joke版了嗎 XD 你可以用static linking 或是請他 06/01 15:58
nowar100:下載一個叫作redistribution(?)的東西 裡面有微軟的一些 06/01 15:59
nowar100:framework的元件 06/01 15:59
nowar100:喔我的joke是指一樓推文 不是本文 :D 06/01 16:00
janice001:害我以為 我又問蠢問題了 Q_Q 06/01 17:32
VictorTom:debug版的程式裝VC redist可能沒有用, VC redist印象中 06/01 17:40
VictorTom:只會含release版的dll說@_@" build release版的再請它裝 06/01 17:40
VictorTom:VC redist是一個方式(注意版本要match); 或者像板大說的 06/01 17:41
VictorTom:使用static link, 在VC projsetting裡的C++\Code Gen\ 06/01 17:42
VictorTom:Runtime Library選到"沒有dll"的setting; 另一個可以試 06/01 17:42
VictorTom:的方式, VC安裝目錄下的 VC\redist\Debug_NonRedist\ 06/01 17:43
VictorTom:自己看是x86還x64, 用到CRT/MFC/MP等, 把子目錄裡的所有 06/01 17:44
VictorTom:檔案都一起copy給對方和執行檔放在一起跑....@_@" 06/01 17:44