繁体   English   中英

c++ 17 std::filesystem 不能在其他(windows 10)计算机上运行

[英]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

你检查过

libstdc++-6.dll

是否可用或相关库是静态包含的静态链接库

尝试使用更新的 MinGW-w64 而不是旧的 MinGW。 您可以在https://winlibs.com/找到最新的独立版本

MinGW-w64 可以针对 Windows 32 位和 64 位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM