Runtime error Julia应用程序的编译版本在运行时出现MethodError,否则运行正常
我有一个运行良好的Julia应用程序,但我想制作一个编译版本,并且更易于分发。据我所知,这是我的工作 我能够构建可执行文件,只要请求它的Runtime error Julia应用程序的编译版本在运行时出现MethodError,否则运行正常,runtime-error,julia,packagecompiler.jl,Runtime Error,Julia,Packagecompiler.jl,我有一个运行良好的Julia应用程序,但我想制作一个编译版本,并且更易于分发。据我所知,这是我的工作 我能够构建可执行文件,只要请求它的--help,它就可以正常运行,但当我希望它做一些实际工作(处理数据)时,在一些初始信息输出后,它会崩溃,并显示以下错误消息: fatal: error thrown and no exception handler available. MethodError(f=typeof(Base.convert)(), args=(Int32, nothing), w
--help
,它就可以正常运行,但当我希望它做一些实际工作(处理数据)时,在一些初始信息输出后,它会崩溃,并显示以下错误消息:
fatal: error thrown and no exception handler available.
MethodError(f=typeof(Base.convert)(), args=(Int32, nothing), world=0x00000000000065d9)
rec_backtrace at /home/bli/src/julia/src/stackwalk.c:94
record_backtrace at /home/bli/src/julia/src/task.c:219 [inlined]
jl_throw at /home/bli/src/julia/src/task.c:429
jl_method_error_bare at /home/bli/src/julia/src/gf.c:1606
jl_method_error at /home/bli/src/julia/src/gf.c:1624
jl_apply_generic at /home/bli/src/julia/src/gf.c:2161
julia_main at /home/bli/src/qaf_demux/Julia/QafDemux/bin/qaf_demux_to_compile.jl:12
julia_main at /home/bli/src/qaf_demux/Julia/QafDemux/deps/builddir/qaf_demux.so (unknown line)
main at ./deps/builddir/qaf_demux (unknown line)
__libc_start_main at /build/glibc-LK5gWL/glibc-2.23/csu/../csu/libc-start.c:291
_start at ./deps/builddir/qaf_demux (unknown line)
这MethodError
是什么意思?我可以从回溯中得到什么有用的信息
下面是用来编译它的deps/build.jl
脚本:
import Pkg
Pkg.add("ArgParse")
Pkg.add("IterTools")
Pkg.add("FASTX")
Pkg.add("CodecZlib")
Pkg.add("REPL")
Pkg.add("PackageCompiler")
using PackageCompiler
build_executable(joinpath(@__DIR__, "../bin/qaf_demux_to_compile.jl"), "qaf_demux", snoopfile=joinpath(@__DIR__, "../bin/snoop.jl"))
snoop.jl
使用一些测试命令行(对应于用于测试已编译可执行文件的命令行)调用myQafDemux
包的主函数:
qaf_demux_to_compile.jl
,根据PackageCompiler
说明,如下所示:
#!/usr/bin/env julia
push!(LOAD_PATH, abspath(joinpath(@__DIR__, "../src/")))
import QafDemux
const qd = QafDemux
Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
qd.main()
end
工作正常的非编译版本几乎相同:
#!/usr/bin/env julia
push!(LOAD_PATH, abspath(joinpath(@__DIR__, "../src/")))
import QafDemux
const qd = QafDemux
qd.main()
(在我调查的稍早阶段交叉张贴在)
编辑:工作解决方案 根据@的建议,我修改了我的
QafDemux
模块的主函数,使其现在返回一个整数,并且使用的是,这也是传递给PackageCompiler.build\u executable
的代码中的julia\u main
函数的返回值
bin/qaf_demux_to_compile.jl
:
#!/usr/bin/env julia
push!(LOAD_PATH, abspath(joinpath(@__DIR__, "../src/")))
import QafDemux
const qd = QafDemux
Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
return qd.main()
end
(我还必须更改主函数,使其接受可选的命令行,因为snoopfile在其他方面实际上是错误的)。查看stacktrace,您可以看到Julia正在尝试将
nothing
转换为Int32
,行中:
MethodError(f=typeof(Base.convert)(), args=(Int32, nothing), world=0x00000000000065d9)
这是因为您的julia_main
函数没有显式返回任何内容,而且qd.main
似乎也没有返回任何内容。在没有显式返回值的情况下,Julia默认不返回任何内容
但是,在方法的类型约定中,指定了julia_main
必须返回Cint
,该值在系统上似乎是Int32
。因此,Julia正在尝试将Julia_main(隐式)返回的内容转换为Int32
——这是不可能的
要解决这个问题,您只需要确保返回一个整数。更好的做法是:
Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
try
qd.main()
catch e
print(stderr, e) # print the error to standard error
return 1 # in command line tools, a return value of 1 means error
finally
return 0 # similarly, a return value of 0 means that the program ran properly
end
end
根据您的用例,您可能还想签出。可能您需要返回一个整数?在函数的末尾尝试
返回0
。@logankilpatrick我也尝试使用ApplicationBulider
,得到的可执行文件也有同样的问题。也就是说,我不确定是否理解PackageCompiler
和ApplicationBuilder
之间的区别,除了内置文件的放置位置。在我看来,在这两种情况下,仍然没有单个文件独立的可执行文件:它们都提供了需要与可执行文件一起提供的共享对象。@AnshulSinghvi这就是问题之一。谢谢另一个原因是我没有注意到编译失败,因为我试图在snoopfile中使用命令行参数模拟调用。我报告的错误一定是使用以前编译的版本生成的,没有snoopfile。@AnshulSinghvi是的,谢谢。不要犹豫,把你的评论作为一个答案发表出来,也许可以谈谈是什么让你怀疑这就是问题所在。
Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
try
qd.main()
catch e
print(stderr, e) # print the error to standard error
return 1 # in command line tools, a return value of 1 means error
finally
return 0 # similarly, a return value of 0 means that the program ran properly
end
end