gpt4 book ai didi

runtime-error - MethodError 在运行时用于编译版本的 Julia 应用程序,否则运行良好

转载 作者:行者123 更新时间:2023-12-03 09:05:14 25 4
gpt4 key购买 nike

我有一个运行良好的 Julia 应用程序,但我想制作一个已编译且更易于分发的版本。据我了解,这是 PackageCompiler 的工作.

我能够构建可执行文件,并且在询问它的 --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调用我的 QafDemux 的主要功能带有一些测试命令行的包(对应于用于测试已编译可执行文件的命令行):
#!/usr/bin/env julia

push!(LOAD_PATH, abspath(joinpath(@__DIR__, "../src/")))
import QafDemux
const qd = QafDemux

test_args = "-i ../../test_data/TCR_ampli_R1_50k.fastq.gz -o test_run -b GCAGAGATAAGC GCAGAGATGCAC GCAGAGACTCAG GCAGAGAGGAAT GCAGAGACGAGG GCAGAGAAGGAG GCAGAGATGTTG GCAGAGACAACT GCAGAGAGGCTA GCAGAGAGAATG GCAGAGACCAAC GCAGAGAGAGAC -s 3 -m 2 -p 0.1"
qd.main(split(test_args))

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()

(在我调查的稍早阶段交叉发布于 https://discourse.julialang.org/t/understanding-runtime-errors-with-packagecompiler-built-executables/29120/2)

编辑:工作解决方案

基于@ Anshul Singvi 的建议,我修改了我的 QafDemux的主要功能模块,使其现在返回一个整数,并使用它,这也是 julia_main 的返回值传递给 PackageCompiler.build_executable 的代码中的函数.
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

(我还必须更改 main 函数,以便它接受可选的命令行,否则 snoopfile 实际上是错误的)。

最佳答案

查看堆栈跟踪,您可以看到 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

关于runtime-error - MethodError 在运行时用于编译版本的 Julia 应用程序,否则运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58105935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com