feat: 自包含安装包 — ld.lld + MinGW 库 (39MB, 零依赖)

This commit is contained in:
2026-06-05 22:01:01 +08:00
parent 1e161ecfff
commit 39d8bad022
2 changed files with 58 additions and 29 deletions
+34 -21
View File
@@ -12,6 +12,21 @@
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <windows.h>
#endif
// 获取 exe 所在目录(用于定位打包的 MinGW 库)
static void get_exe_dir(char* buf, size_t size) {
#ifdef _WIN32
GetModuleFileNameA(NULL, buf, (DWORD)size);
char* last = strrchr(buf, '\\');
if (last) *last = '\0';
#else
buf[0] = '.'; buf[1] = '\0';
#endif
}
// 读取整个文件到内存
static char* read_file(const char* path, size_t* size) {
FILE* f = fopen(path, "rb");
@@ -137,34 +152,32 @@ int main(int argc, char** argv) {
return 1;
}
// 链接:优先 clang + lldLLVM 自带)fallback gcc
char cmd[1024];
// 链接:优先安装包自带的 ld.lld + MinGW 库fallback clang/gcc
char cmd[2048];
int ret = -1;
char exe_dir[512];
get_exe_dir(exe_dir, sizeof(exe_dir));
// 构造 LLVM bin 路径(从 LLVM-C.dll 的位置推断
char llvm_clang[512];
snprintf(llvm_clang, sizeof(llvm_clang),
"D:/settings/Language/LLVM/bin/clang.exe");
// 1) 优先: clang + lld(零新依赖,已随 LLVM 安装)
// 1) 优先: 安装包自带的 ld.lld + 自带 MinGW 库(完全自包含
snprintf(cmd, sizeof(cmd),
"\"%s\" -target x86_64-w64-windows-gnu -fuse-ld=lld \"%s\" -o \"%s\"",
llvm_clang, obj_path, output);
"\"%s/ld.lld.exe\" -m i386pep "
"\"%s/mingw_lib/crt2.o\" \"%s/mingw_lib/crtbegin.o\" "
"\"%s\" "
"-L \"%s/mingw_lib\" "
"-lmingw32 -lmcfgthread -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt "
"-ladvapi32 -lshell32 -luser32 -lkernel32 -lntdll "
"\"%s/mingw_lib/crtend.o\" "
"-o \"%s\"",
exe_dir, exe_dir, exe_dir,
obj_path, exe_dir,
exe_dir, output);
ret = system(cmd);
// 2) 备选: 系统 PATH 中的 clang
// 2) 最后 fallback: gcc(开发机有 MinGW 时)
if (ret != 0) {
snprintf(cmd, sizeof(cmd),
"clang -target x86_64-w64-windows-gnu -fuse-ld=lld \"%s\" -o \"%s\"",
obj_path, output);
ret = system(cmd);
}
// 3) 最后 fallback: gcc
if (ret != 0) {
snprintf(cmd, sizeof(cmd),
"gcc \"%s\" -o \"%s\"",
obj_path, output);
"gcc \"%s\" -o \"%s\"",
obj_path, output);
ret = system(cmd);
}