在 Julia 基准教程中编译 C 代码

Sam*_*asa 4 c gcc julia

本讲座的第一个单元格中运行代码后,我试图调用该函数c_sum。但是,我不断收到错误消息:

error compiling c_sum: could not load library "/tmp/juliaOT2a9V"
/tmp/juliaOT2a9V.so: wrong ELF class: ELFCLASS64
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ski 7

根据错误,问题似乎是您试图将 64 位共享对象 ( .so) 文件加载到 32 位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
Run Code Online (Sandbox Code Playgroud)

如果您的指示您正在运行 32 位julia,那么您可以尝试安装 64 位julia或尝试使用-m32标志而不是-m64标志将 C 代码编译为 32 位 ELF 共享对象文件。您还可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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

有关 ELF 类型不匹配的更多信息,请访问:

  • 更新到 64 位 Julia 版本成功了,谢谢! (2认同)