生成器代码模式与自编译模式都要调 g++,但用户机器上的 g++ 可能在任意位置,也可能根本没装。这一块要解决的是「找得到」与「找得到之后能跑起来」。
路径保存在配置里
// g++ 路径配置文件:exe 同目录 cdc_gpp.cfg(一行,纯路径)
static wstring GppCfgPath() { return Utf8ToWstr(g_exeDir) + L"\\cdc_gpp.cfg"; }
static string ReadGppCfg() {
string s = ServeFile(WstrToUtf8(GppCfgPath()));
while (!s.empty() && (s.back() == '\r' || s.back() == '\n' || s.back() == ' ')) s.pop_back();
return s;
}
static bool WriteGppCfg(const string& gpp) {
FILE* f = OpenFileS(WstrToUtf8(GppCfgPath()).c_str(), "wb");
if (!f) return false;
fwrite(gpp.data(), 1, gpp.size(), f);
fclose(f);
return true;
}自动检测的顺序
- 配置里记住的路径 —— 上次选过就直接用,这是最快路径
- exe 同目录及
mingw64\bin—— 便携整合包自带编译器,此时用户完全不需要配置 PATH环境变量 —— 用户自己装过 MinGW 并加进了环境变量- 常见安装路径 —— MinGW、TDM-GCC、CodeBlocks、Dev-Cpp 等默认目录
前两级覆盖了绝大多数情况。都找不到时,界面上的「自动检测」按钮会触发一次更宽范围的搜索,并把结果写回配置。
版本差异:内置编译器只到 C++11
便携包自带的 MinGW 版本较老,只支持到 C++11。而生成器与后端统一按 -std=c++23 编译,两者会冲突。处理方式是:把编译器指到系统里较新的 MinGW,路径会被记住、下次自动加载。
| 场景 | 推荐做法 |
|---|---|
| 只想用随机生成 | 不需要编译器,用不着配 |
| 要用生成器代码模式 / 自编译 | 装一个较新的 MinGW-w64,在设置里指定 g++.exe 路径 |
| 换电脑或重装 | 重新选一次即可,路径写在本机配置里,不跟着安装包走 |
找到之后还得能跑
g++ 只是个驱动程序,真正干活的是它拉起的 cc1plus、as、ld。这些子程序需要 MinGW 目录下的动态库,因此编译时把子进程的工作目录设到 mingw64\bin —— Windows 的 DLL 搜索顺序里「当前目录」优先于 PATH,等于临时把这台机器的编译器目录加进了库搜索路径,却不需要动任何环境变量。