[英]c++ 17 std::filesystem can not run on other (windows 10) computer
我有一個程序,在 Windows 10 上使用 MinGW 編譯,我希望這個程序在其他人的計算機上運行,即使他們沒有安裝 MinGW 或任何 c++ 編譯器。
通常,這很容易。
我只包含任何第三方庫的 exe 文件和 dll 文件,它確實有效……除非我使用一個特定的 c++ 標准庫,即 c++ 17 中的<filesystem>
庫,在這種情況下,我的程序只能運行在進行編譯的計算機上。
例如,該程序僅將當前所在的文件打印到文件中。
#include<fstream>
#include<filesystem>
using namespace std;
int main(int argc, char* argv[])
{
ofstream OUT("location.txt");
OUT<<filesystem::current_path()<<endl;
OUT.close();
return 0;
}
我用mingw32這樣編譯它:
g++ stupid_program.cpp -o stupid_program.exe -std=c++17 -O2 -Wall -Wextra -Wpedantic
這確實適用於進行編譯、從終端運行(或雙擊 .exe)文件以創建包含當前執行位置的文件的 Windows 10 計算機。
但是,如果我將此 .exe 文件移動到另一台未編譯它的 Windows 10 計算機,雙擊 .exe 文件現在會導致出現錯誤彈出窗口,告訴我在 DLL 庫中找不到入口_ZNKSt10filesystem7_cxx114path5_list13_impl_deletercIEPN"_5_ImpIE
C:\PATH_TO_PROGRAM\stupid_program.exe
。
但是文件系統庫沒有任何 .dll 文件,因為它是標准庫的一部分。 我知道文件系統是標准的最新補充......但我確實包含了參數-std=c++17
並且應該已經解決了這個問題。
那么有什么方法可以制作一個程序,它使用文件系統庫,在其他一些 Windows 10 計算機上工作,而不是編譯它的計算機?
g++ 是版本 9.2.0 g++.exe (MinGW.org GCC Build-2) 9.2.0
請注意,舊版 MinGW 的 g++ 版本 8.xx 存在一個舊錯誤,其中文件系統庫無法編譯,不是這樣,因為該錯誤完全阻止了編譯; 此 cam 僅在編譯計算機上編譯和運行
運行ntldd -R my_program.exe
以獲取您的程序所依賴的 dll 列表。
查看編譯器的bin
目錄,並將任何匹配的 DLL 復制到與 .exe 相同的目錄中。 忽略 NTLDD 報告的路徑,只查看 .dll 文件名。 忽略編譯器未附帶的任何 dll(如果您不使用第三方庫)。
然后再次運行它,確認沒有從編譯器的 bin 目錄中加載任何其他內容。
將生成的 dll 與您的程序一起發送。
[我正在使用] mingw32 最新版本
有許多不同的 MinGW 發行版,而您使用的那個並不是最好的。 它提供過時的 GCC(9.x 與 12.x),AFAIK 仍然不支持多線程。
我會推薦MSYS2 。
嘗試使用更新的 MinGW-w64 而不是舊的 MinGW。 您可以在https://winlibs.com/找到最新的獨立版本
MinGW-w64 可以針對 Windows 32 位和 64 位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.