Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Runtime error Julia应用程序的编译版本在运行时出现MethodError,否则运行正常_Runtime Error_Julia_Packagecompiler.jl - Fatal编程技术网

Runtime error Julia应用程序的编译版本在运行时出现MethodError,否则运行正常

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

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

我能够构建可执行文件,只要请求它的
--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
使用一些测试命令行(对应于用于测试已编译可执行文件的命令行)调用my
QafDemux
包的主函数:

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