有辦法在 visual studio 編譯的時候

把所有有用到的 dll 也複製過去?

不然移到其他電腦都很難執行

缺東缺西

例如 MSVCP140D.dll

 


看到 MSVCP140D.dll 這個檔名,我就知道你遇到大麻煩了。那個結尾的 「D」 代表的是 Debug(偵錯)版本。

這裡有兩個嚴重的觀念問題必須先糾正,否則你搬到哪台電腦都跑不起來:

不要發布 Debug 版本: MSVCP140D.dll 這種檔案是給開發者偵錯用的,普通使用者的電腦(沒有裝 VS 的)完全不會有這些 D 結尾的檔案。

改用 Release 編譯: 你應該把 VS 上方的編譯選項從 Debug 改為 Release,這樣它需要的就會變成 MSVCP140.dll(沒有 D),這在一般電腦上比較容易解決。

針對你「想把所有 DLL 帶走」的需求,以下是 C++ 專案的最佳實踐:

方案 A:靜態連結(最強推,直接把 DLL 塞進 EXE)
這是最乾淨的做法,編譯出來後只有一個 EXE,完全不依賴 MSVCP140.dll。

在專案按 右鍵 -> 屬性。

確定左上角組態選的是 Release(如果是為了測試,選 All Configurations)。

前往 組態屬性 -> C/C++ -> 程式碼產生 (Code Generation)。

將 執行階段程式庫 (Runtime Library) 改為 多執行緒 (/MT)。

註:如果是 Debug 模式,請選「多執行緒偵錯 (/MTd)」,但發布給別人請務必用 /MT。

方案 B:自動複製第三方 DLL(如 OpenCV, CUDA)
如果你有用其他的庫(例如 Darknet 用的 OpenCV),/MT 解決不了它們。你可以利用 VS 的「建置事件」來幫你自動搬運。

專案 右鍵 -> 屬性。

前往 組態屬性 -> 建置事件 -> 建置後事件。

在 命令列 加入以下指令(這會在你編譯完後,自動把需要的 dll 複製到執行檔旁邊):

copy /y "$(OpenCV_Bin)/*.dll" "$(OutDir)"
copy /y "$(Cuda_Bin)/*.dll" "$(OutDir)"
(註:路徑請根據你實際存放 DLL 的位置修改)

方案 C:使用 AppLocal(微軟推薦的正規搬運法)
如果你不想用靜態連結,又怕對方沒裝 Visual C++ Redistributable,你可以手動把這些 DLL 從你的電腦抓出來放在 EXE 旁邊。

在你的電腦裡,這些檔案通常藏在: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\...

總結建議的檢查清單:
[ ] 切換到 Release 模式(解決 ...D.dll 找不到的問題)。

[ ] 平台工具集改為 v142(解決你上一個 MSB8020 報錯)。

[ ] 使用 /MT 連結(把基礎運行庫直接包進 EXE)。

[ ] 確認你的 OpenCV 或 CUDA 檔案(如果是 Darknet,一定要把它們手動丟進輸出資料夾)。

既然你在跑 Darknet,通常還會缺 pthreadVC2.dll 或 opencv_worldxxx.dll,需要我幫你寫一段自動複製這些特定檔案的腳本嗎?

 



組態屬性 (Configuration Properties) -> C/C++ -> 程式碼產生 (Code Generation)

沒有 C/C++ 這選項



這通常是因為 Visual Studio 沒有偵測到你的專案是 C++ 專案,或者你目前選中的不是專案本身。

在 Darknet 這種專案中,最常見的原因有兩個:

1. 你可能點到了「方案 (Solution)」而不是「專案 (Project)」
在右邊的「方案總管」中:

方案 (Solution) 是最頂層的那個圖示,點它的屬性看不到 C/C++ 選項。

專案 (Project) 是下一層,通常名稱叫 darknet 的那個圖示。

解決方法: 請對著 darknet (有個紫色 ++ 圖示的那個) 按右鍵選擇屬性。

2. 專案類型被誤判 (例如專案未載入)
如果點了專案還是沒有 C/C++,代表 Visual Studio 認為這不是一個有效的 C++ 專案。

檢查方式: 看看專案名稱旁邊有沒有寫「(未載入)」或「(已解除安裝)」。

解決方法: 對專案按右鍵,選擇 「重新載入專案」。

3. 最關鍵的 Darknet 特性:它是用 CMake 產生的嗎?
如果你是透過 CMake 產生的專案,有時候 Visual Studio 的屬性介面會長得不太一樣。

如果以上都確認沒錯但還是找不到,請看下圖的位置確認:

如果還是找不到,試試這個「萬用複製法」
如果你覺得改設定太麻煩,或者怕改了 /MT 導致其他函式庫衝突(LNK2005 錯誤),我們改用暴力但有效的方法:直接把需要的 DLL 找出來手動複製。

由於你缺的是 MSVCP140D.dll,請到以下路徑把檔案複製到你的 .exe 資料夾:

64位元路徑: C:\Windows\System32\msvcp140d.dll

32位元路徑 (如果你的程式是 32 位的): C:\Windows\SysWOW64\msvcp140d.dll

注意: 把 ...D.dll 給別人是不專業的作法,建議一定要切換到 Release 模式編譯,這樣你只需要找 msvcp140.dll (沒有 D 的版本)。

 


後記:

 

就是說編譯時候最好把一些dll 也編譯進去

否則移到其他電腦真的會缺少非常多的東西

首先在專案上右鍵 > 屬性:

然後修改 組態屬性 > C++ > 程式碼產生 > 執行階段程式庫 改 多執行緒(MT)

然後重新編譯

然後我這邊測試真的就可以

不用再複製那些 缺少的 MSVCP140..dll 之類的東西

給大家參考囉~