c - 在 Julia 基准测试教程中编译 C 代码
问题描述
在本讲座的第一个单元格中运行代码后,我正在尝试调用该函数c_sum
。但是,我不断收到错误:
error compiling c_sum: could not load library "/tmp/juliaOT2a9V"
/tmp/juliaOT2a9V.so: wrong ELF class: ELFCLASS64
我尝试使用 gcc 标志 -m64 修改代码,但这没有帮助。我是编码新手,所以我很困惑到底是什么问题,以及如何解决它。任何帮助将不胜感激!
解决方案
根据该错误,问题似乎是您正在尝试将 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
-m64
file
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 类型不匹配的更多信息,请参见此处:
推荐阅读
- r - Shiny for .RData 中的 reactiveFileReader
- android - 将 APP ENGINE 模块从 Android Studio 项目中分离出来
- gecko - geckobrowser 使用 c# 在 textarea 中设置一个值
- ios - 如何在谷歌地图导航中显示地址而不是坐标?
- php - 如何访问APP目录外的数据库
- python - python - 如果已经给出提示,则转到其他未使用的随机提示
- python - pandas 在同一行合并相同的值
- c++ - clang 无法识别 lambda 中的基类
- javascript - 反应:如果两个道具匹配,则触发点击 div
- javascript - HTML 表单单选按钮和复选框