Windows下用StaticCompiler编译Julia独立可执行文件的输出问题及解决
Windows下StaticCompiler编译Julia代码无字符串输出问题及解决方法
问题背景
在Windows系统下使用StaticCompiler编译Julia代码时,生成的可执行文件无法输出字符串(既不输出到标准输出也不写入文件),但编译f() = getchar()这类代码可正常运行。
尝试的代码及遇到的问题
测试代码如下:
using StaticCompiler, StaticTools f() = println(c"h") compile_executable(f,(),"./")
- 生成目标文件
f.o后链接失败:默认使用clang链接时,提示错误f.o unknown file type - 改用PackageCompiler作为工件安装的gcc链接后无错误,但生成的可执行文件仍无法输出字符串
底层LLVM IR分析
StaticTools会将println转换为调用@puts的LLVM IR,示例代码如下:
function f() Base.llvmcall((""" declare i32 @puts(i8*) define i32 @main() { %a = alloca i8 store i8 104, i8* %a call i32 @puts(i8* %a) ret i32 0 } """, "main"), Int32, Nothing, Nothing) end
这段代码在Julia REPL中可正常运行,但通过compile_executable编译后生成的可执行文件无输出。
StaticCompiler借助GPUCompiler生成的LLVM IR模块如下:
source_filename = "start" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-w64-mingw32" define i32 @t() local_unnamed_addr #0 { top: %0 = call fastcc i32 @julia_t_1040u1042() ret i32 %0 } define internal fastcc i32 @julia_t_1040u1042() unnamed_addr { %a = alloca i8, align 1 store i8 65, i8* %a, align 1 %1 = call i32 @puts(i8* noundef nonnull %a) ret i32 0 } declare i32 @puts(i8*) local_unnamed_addr attributes #0 = { "probe-stack"="inline-asm" } !llvm.module.flags = !{!0, !1} !0 = !{i32 2, !"Dwarf Version", i32 4} !1 = !{i32 2, !"Debug Info Version", i32 3}
疑问
为何StaticCompiler在Windows下无法正常输出字符串?是否需要针对Windows调整Julia LLVM IR、StaticTools中的字符串表示、GPUCompiler配置或环境变量?
解决方案
适配Windows的核心方法是:使用clang直接从GPUCompiler生成的LLVM IR生成原生二进制文件,而非先由GPUCompiler生成目标文件再用clang链接。可测试适配Windows的StaticCompiler分叉版本来解决该问题。
内容的提问来源于stack exchange,提问作者Thomas R
相关产品推荐
相关产品推荐

