我有一个程序,在Windows 10上使用MinGW编译,我希望这个程序在其他人的计算机上运行,即使他们没有安装MinGW或任何c编译器。
通常,这很容易。
我只包含任何第三方库的exe文件和dll文件,它确实有效…除非我使用一个特定的c标准库,否则
例如,此程序仅将其当前所在的文件打印到文件中。
#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文件会导致出现错误弹出窗口,告诉我在DLL-库C:\PATH_TO_PROGRAM\stupid_program.exe
中找不到入口点_ZNKSt10filesystem7_cxx114path5_list13_impl_deletercIEPN"_5_ImpIE
。
但是文件系统库没有任何. dll文件,因为它是标准库的一部分。我知道文件系统是标准的最新添加…但是我确实包含了参数-std=c 17
,这应该已经解决了。
那么,我有没有办法让一个使用文件系统库的程序在其他Windows 10计算机上运行,而不是编译它的计算机?
g是版本9.2.0g. exe(MinGW.orgGCCBuild-2)9.2.0
注意,有一个旧的bug,旧的MinGW版本为g 8. xx,文件系统库无法编译,这不是它,因为bug完全阻止编译;这个凸轮编译和运行,只是在编译计算机上
运行ntldd-Rmy_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位。