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