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



我有一个程序,在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

这在进行编译的Windows 10计算机上有效,从终端运行(或双击.exe)文件创建一个包含当前执行位置的文件。

然而,如果我将这个。exe文件移动到另一台windows 10计算机,它没有编译它,双击。exe文件现在会导致一个错误弹出窗口出现,告诉我入口点_ZNKSt10filesystem7_cxx114path5_list13_impl_deletercIEPN"_5_ImpIE无法在dll库C:PATH_TO_PROGRAMstupid_program.exe中找到。

但是文件系统库没有任何.dll文件,因为它是标准库的一部分。我知道文件系统是最近加入标准的…但我确实包括了-std=c++17,这应该已经解决了这个问题。

那么,我有没有办法让一个使用文件系统库的程序在其他Windows 10计算机上运行,而不是在编译它的计算机上运行?

g++ is version 9.2.0g++.exe (MinGW.org GCC Build-2) 9.2.0

注意,在g++版本8中有一个旧的MinGW错误。Xx文件系统库无法编译的地方,不是这个,因为那个bug完全阻止了编译;此CAM仅在编译计算机

上编译并运行。

运行ntldd -R my_program.exe获取程序所依赖的dll列表。

查看编译器的bin目录,并将任何匹配的dll复制到与.exe相同的目录中。忽略NTLDD报告的路径,只查看.dll文件名。忽略编译器没有附带的任何dll(如果你不使用第三方库)。

然后再次运行它,确认没有从编译器的bin目录加载其他内容。

船产生的dll程序。


[我正在使用]最新版本的mingw32

有许多不同的MinGW发行版,您正在使用的并不是最好的。它提供了一个过时的GCC(9)。(x vs . 12.x), AFAIK仍然不支持多线程。

我推荐MSYS2。

你有没有检查

libstdc++-6.dll

可用或相关库被静态包含。静态链接库

尝试使用最新的MinGW-w64而不是旧的MinGW。您可以在https://winlibs.com/

找到最新的独立版本。MinGW-w64可以同时针对Windows 32位和64位。

相关内容

最新更新