首页 > 解决方案 > 在 Julia 基准测试教程中编译 C 代码

问题描述

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

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

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

标签: cgccjulia

解决方案


根据该错误,问题似乎是您正在尝试将 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

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

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

有关 ELF 类型不匹配的更多信息,请参见此处:


推荐阅读