【问题标题】:Compiling C code in Julia benchmark tutorial在 Julia 基准测试教程中编译 C 代码
【发布时间】:2020-07-16 13:45:49
【问题描述】:

this lecture的第一个单元格中运行代码后,我试图调用函数c_sum。但是,我一直收到错误消息:

error compiling c_sum: could not load library "/tmp/juliaOT2a9V"
/tmp/juliaOT2a9V.so: wrong ELF class: ELFCLASS64

我尝试使用 gcc 标志 -m64 修改代码,但这没有帮助。我是编码新手,所以我很困惑到底是什么问题,以及如何解决它。任何帮助将不胜感激!

【问题讨论】:

    标签: c gcc julia


    【解决方案1】:

    根据错误,问题可能是您尝试将 64 位共享对象 (.so) 文件加载到 32 位 julia 二进制文件中。你的 Julia versioninfo 显示了什么?这是我的:

    julia> versioninfo()
    Julia Version 1.6.0-DEV.420
    Commit 0d5efa8846 (2020-07-10 14:27 UTC)
    Platform Info:
      OS: macOS (x86_64-apple-darwin19.5.0)
      CPU: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
      WORD_SIZE: 64
      LIBM: libopenlibm
      LLVM: libLLVM-9.0.1 (ORCJIT, skylake)
    Environment:
      JULIA_EDITOR = subl
      JULIA_SHELL = /bin/bash
      JULIA_INPUT_COLOR = bold
      JULIA_ANSWER_COLOR = light_magenta
      JULIA_PKG_DEVDIR = /Users/stefan/dev
    

    如果您的表明您正在运行 32 位 julia,那么您可以尝试安装 64 位 julia 或尝试使用 @ 将 C 代码编译为 32 位 ELF 共享对象文件987654330@ 标志而不是-m64 标志。你也可以使用file从外部检测这些文件的格式,例如我在我的macOS系统上得到的:

    julia> run(`file $(Sys.which("julia"))`);
    /Users/stefan/dev/julia/usr/bin/julia: Mach-O 64-bit executable x86_64
    
    julia> run(`file $(Clib * "." * Libdl.dlext)`);
    /var/folders/4g/b8p546px3nd550b3k288mhp80000gp/T/jl_ZeTKsr.dylib: Mach-O 64-bit dynamically linked shared library x86_64
    

    由于我的 julia 可执行文件和共享库文件都是 Mach-O 64 位的,因此它们是兼容的并且示例有效。在您的系统上,julia 可能是 32 位的,而 gcc 默认生成 64 位二进制文​​件,因为您使用的是 64 位系统。一般来说,这可能是一个问题,因此即使将-m32 标志传递给gcc 解决了直接问题并允许您使示例工作,我还是建议使用64 位Julia 二进制文件。作为奖励,这将允许您加载比 32 位 Julia 更大的数据集,因为 64 位二进制文​​件可以寻址您计算机的所有(虚拟)内存,而不仅仅是 4GB。

    历史记录:您的 64 位 Linux 机器如何/为什么在单个系统上同时运行 32 位 ELF 和 64 位 ELF 文件? 2001 年,英特尔推出了Itanium IA-64 architecture,这是一个纯 64 位架构,专为高端服务器设计。一年后,AMD 推出了与之竞争的x86_64 architecture,它支持两种处理模式:64 位模式和 32 位(传统)模式。因此,您可以在同一系统上以不同的字长运行不同的进程。 IA-64 从未真正起飞,而 x86_64 非常成功,最终英特尔也开始制造 x86_64 芯片,这可能是您的机器正在运行的,尽管它也可能是 AMD 芯片。所以现在有两种不同类型的 ELF 二进制文件,它们都可以在大多数 PC 上运行,但粒度是进程级别的:你不能将 64 位共享对象加载到 32 位进程中,反之亦然。虽然您的系统可以运行 32 位进程,但由于系统主要是 64 位,大多数程序和库将是 64 位,这就是我建议您切换的原因使用 64 位 Julia 构建。

    更多关于 ELF 类型不匹配的信息在这里:

    【讨论】:

    • 更新到 64 位 Julia 版本成功,谢谢!
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多