我有一个程序,在 Windows 10 上使用 MinGW 编译,我希望该程序能够在其他人的计算机上运行,即使他们没有安装 MinGW 或任何 C++ 编译器。
通常情况下,这很容易。
我只包含任何第三方库的 exe 文件和 dll 文件,它确实有效...除非我使用一个特定的 c++ 标准库,<filesystem>
来自 c++ 17 的库,在这种情况下我的程序只能在进行编译的计算机上运行。
例如,该程序仅将当前所在的文件打印到文件中。
#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
这确实适用于进行编译的 Windows 10 计算机,从终端运行(或双击 .exe)文件以创建包含当前执行位置的文件。
但是,如果我将此 .exe 文件移至另一台未编译它的 Windows 10 计算机,双击该 .exe 文件现在会导致出现错误弹出窗口,告诉我入口点 _ZNKSt10filesystem7_cxx114path5_list13_impl_deletercIEPN"_5_ImpIE
在 DLL 库中找不到 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
请注意,g++ 版本 8.xx 的较旧 MinGW 存在一个旧错误,其中文件系统库无法编译,不是这样,因为该错误完全阻止了编译;该cam仅在编译计算机上编译并运行
最佳答案
运行ntldd -R my_program.exe
获取您的程序所依赖的 dll 列表。
查看编译器的 bin
目录,并将所有匹配的 DLL 复制到 .exe 所在的目录中。忽略 NTLDD 报告的路径,仅查看 .dll 文件名。忽略编译器未附带的任何 dll(如果您不使用第三方库)。
然后再次运行它,确认没有从编译器的 bin 目录中加载任何其他内容。
将生成的 dll 与您的程序一起发送。
[I'm using] Latest version of mingw32
有许多不同的 MinGW 发行版,您使用的发行版并不是最好的。它附带了一个过时的 GCC(9.x 与 12.x),并且 AFAIK 仍然不支持多线程。
我推荐MSYS2相反。
关于C++ 17 std::filesystem 无法在其他(Windows 10)计算机上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72995844/