推 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:是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
補充:
查詢 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