【问题标题】:Crystal lang on Apple Silicone M1Apple Silicon M1 上的 Crystal lang
【发布时间】:2021-11-09 08:38:42
【问题描述】:

当我尝试通过此驱动程序https://github.com/will/crystal-pg 连接到 DB(Postgres) 时,

require "pg"
cnn = PG.connect("postgres://root:password@localhost/my_db_dev")

编译时出错

Undefined symbols for architecture arm64:
  "_EVP_MD_size", referenced from:
      _*OpenSSL::Digest#digest_size:Int32 in O-penS-S-L-5858D-igest.o
      _*Digest::MD5@OpenSSL::Digest#digest_size:Int32 in D-igest5858M-D-5.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Error: execution of command failed with code: 1: `cc "${@}" -o /Users/serg/Pro/demka/demka  -rdynamic -L/opt/homebrew/lib -lz `command -v pkg-config > /dev/null && pkg-config --libs --silence-errors libssl || printf %s '-lssl -lcrypto'` `command -v pkg-config > /dev/null && pkg-config --libs --silence-errors libcrypto || printf %s '-lcrypto'` -lpcre -lgc -lpthread -L/opt/homebrew/Cellar/libevent/2.1.12/lib -levent -liconv -ldl`

crystal -v

Crystal 1.2.1 (2021-10-21)

LLVM: 11.1.0
Default target: aarch64-apple-darwin21.1.0

LLVM 10.0 也会发生同样的错误。 macbook m1可以用水晶开发吗?在我以前使用 ubuntu 的笔记本电脑上,我没有出现这样的错误。

另外,我尝试从源头制作水晶并得到同样的错误

Using /opt/homebrew/opt/llvm@11/bin/llvm-config [version=11.1.0]
CRYSTAL_CONFIG_BUILD_COMMIT="5c6685cc7" CRYSTAL_CONFIG_PATH='$ORIGIN/../share/crystal/src' SOURCE_DATE_EPOCH="1636378125" CRYSTAL_CONFIG_LIBRARY_PATH='$ORIGIN/../lib/crystal' ./bin/crystal build  -o .build/crystal src/compiler/crystal.cr -D without_openssl -D without_zlib
Undefined symbols for architecture arm64:
  "_iconv", referenced from:
      _*IO::Decoder#read<IO::FileDescriptor+>:Nil in _main.o
      _*IO::FileDescriptor@IO#write_string<Slice(UInt8)>:Nil in _main.o
  "_iconv_close", referenced from:
      _~proc3Proc(Pointer(Void), Pointer(Void), Nil)@src/gc/boehm.cr:172 in _main.o
      _~proc5Proc(Pointer(Void), Pointer(Void), Nil)@src/gc/boehm.cr:172 in _main.o
  "_iconv_open", referenced from:
      _*Crystal::Iconv::new<String, String, (Symbol | Nil)>:Crystal::Iconv in _main.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Error: execution of command failed with code: 1: `cc "${@}" -o /Users/serg/.cache/crystal/Users-serg-Apps-crystal-src-ecr-process.cr/macro_run  -rdynamic -L/Users/serg/Downloads/crystal-1.2.1-1/embedded/lib -L/Users/serg/Downloads/crystal-1.2.1-1/embedded/lib -lpcre -lgc -lpthread -L/opt/local/lib -levent -liconv -ldl`
make: *** [.build/crystal] Error 1

我尝试用rosetta制作它,有同样的错误

Using /opt/homebrew/opt/llvm@11/bin/llvm-config [version=11.1.0]
CRYSTAL_CONFIG_BUILD_COMMIT="5c6685cc7" CRYSTAL_CONFIG_PATH='$ORIGIN/../share/crystal/src' SOURCE_DATE_EPOCH="1636378125" CRYSTAL_CONFIG_LIBRARY_PATH='$ORIGIN/../lib/crystal' ./bin/crystal build  -o .build/crystal src/compiler/crystal.cr -D without_openssl -D without_zlib
ld: warning: ignoring file /opt/local/lib/libiconv.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64
Undefined symbols for architecture x86_64:
  "_iconv", referenced from:
      _*IO::Decoder#read<IO::FileDescriptor+>:Nil in _main.o
      _*IO::FileDescriptor@IO#write_string<Slice(UInt8)>:Nil in _main.o
  "_iconv_close", referenced from:
      _~proc3Proc(Pointer(Void), Pointer(Void), Nil)@src/gc/boehm.cr:172 in _main.o
      _~proc5Proc(Pointer(Void), Pointer(Void), Nil)@src/gc/boehm.cr:172 in _main.o
  "_iconv_open", referenced from:
      _*Crystal::Iconv::new<String, String, (Symbol | Nil)>:Crystal::Iconv in _main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Error: execution of command failed with code: 1: `cc "${@}" -o /Users/serg/.cache/crystal/Users-serg-Apps-crystal-src-ecr-process.cr/macro_run  -rdynamic -L/Users/serg/Downloads/crystal-1.2.1-1/embedded/lib -L/Users/serg/Downloads/crystal-1.2.1-1/embedded/lib -lpcre -lgc -lpthread -L/opt/local/lib -levent -liconv -ldl`
make: *** [.build/crystal] Error 1

我不想从源头制造水晶,我认为解决我的问题,我只想得到一个工作水晶。

所以,现在我从 brew 安装中获得了水晶

Crystal 1.2.1 (2021-10-21)
LLVM: 11.1.0
Default target: aarch64-apple-darwin21.1.0

而且,我在编译过程中仍然出错

Undefined symbols for architecture arm64:
  "_EVP_MD_size", referenced from:
      _*OpenSSL::Digest#digest_size:Int32 in O-penS-S-L-5858D-igest.o
      _*Digest::MD5@OpenSSL::Digest#digest_size:Int32 in D-igest5858M-D-5.o
  "_iconv", referenced from:
      _*Crystal::Iconv#convert<Pointer(Pointer(UInt8)), Pointer(UInt64), Pointer(Pointer(UInt8)), Pointer(UInt64)>:UInt64 in C-rystal5858I-conv.o
  "_iconv_close", referenced from:
      _*Crystal::Iconv#close:Nil in C-rystal5858I-conv.o
  "_iconv_open", referenced from:
      _*Crystal::Iconv#initialize<String, String, (Symbol | Nil)>:Nil in C-rystal5858I-conv.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Error: execution of command failed with code: 1: `cc "${@}" -o /Users/serg/.cache/crystal/crystal-run-demka.tmp  -rdynamic -L/opt/homebrew/lib -lz `command -v pkg-config > /dev/null && pkg-config --libs --silence-errors libssl || printf %s '-lssl -lcrypto'` `command -v pkg-config > /dev/null && pkg-config --libs --silence-errors libcrypto || printf %s '-lcrypto'` -lpcre -lgc -lpthread -L/opt/local/lib -levent -liconv -ldl`

所有下一个环境都是空的

$CRYSTAL_LIBRARY_PATH  #empty
$LIBRARY_PATH          #empty
$PKG_CONFIG_PATH       #empty

但是命令crystal env

CRYSTAL_CACHE_DIR=/Users/serg/.cache/crystal
CRYSTAL_PATH=lib:/opt/homebrew/Cellar/crystal/1.2.1/libexec/../share/crystal/src:/opt/homebrew/Cellar/crystal/1.2.1/src
CRYSTAL_VERSION=1.2.1
CRYSTAL_LIBRARY_PATH=/opt/homebrew/lib
CRYSTAL_OPTS=''

如何修复 OpenSSL 链接?

【问题讨论】:

  • 这看起来像是编译和链接时间之间的 OpenSSL 版本不匹配。您是如何安装 Crystal 的,您的 $CRYSTAL_LIBRARY_PATH$LIBRARY_PATH$PKG_CONFIG_PATH 是什么样的?
  • @JonneHaß,我尝试从源头制作水晶,我看到下一个输出Using /opt/homebrew/opt/llvm@11/bin/llvm-config [version=11.1.0] CRYSTAL_CONFIG_BUILD_COMMIT="5c6685cc7" CRYSTAL_CONFIG_PATH='$ORIGIN/../share/crystal/src' SOURCE_DATE_EPOCH="1636378125" CRYSTAL_CONFIG_LIBRARY_PATH='$ORIGIN/../lib/crystal' ./bin/crystal build -o .build/crystal src/compiler/crystal.cr -D without_openssl -D without_zlib Undefined symbols for architecture arm64:
  • @JonneHaß,另外,我尝试通过rosetta制作水晶,我得到了同样的错误ld: warning: ignoring file /opt/local/lib/libiconv.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64 Undefined symbols for architecture x86_64
  • 一次只关注一个问题会很好。这里的 cmets 也不能进行良好的对话,更新最初的问题会更好。正如这里所证明的那样,在你的两个 cmets 中,有趣的部分都在它的末尾被切断了:)
  • 您希望在这篇文章中回答哪个问题?如何从源代码构建 Crystal 或如何解决 OpenSSL 链接问题?每篇文章请只关注一个主题。

标签: openssl linker apple-m1 crystal-lang


【解决方案1】:

确保您拥有来自 Homebrew 的最新水晶包以及 openssl@1.1 包:

brew upgrade
brew install crystal openssl@1.1

确保 Homebrew 包的包装器在您的路径中:

$ which crystal
/opt/homebrew/bin/crystal

您没有设置显式 PKG_CONFIG_PATH 并且包装器正确设置了它:

$ echo $PKG_CONFIG_PATH

$ grep PKG $(which crystal)
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH:+$PKG_CONFIG_PATH:}/opt/homebrew/opt/openssl@1.1/lib/pkgconfig

要从源代码构建 Crystal,您需要安装所有依赖项。从错误消息中,听起来 libiconv 丢失或找不到。

【讨论】:

    【解决方案2】:

    我通过将/usr/lib 添加到CRYSTAL_LIBRARY_PATH 解决了问题。 我刚刚将export CRYSTAL_LIBRARY_PATH=/opt/homebrew/lib:/usr/lib 添加到~/.zprofile,现在水晶工作正常

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2021-05-08
      • 1970-01-01
      • 2022-01-22
      • 2021-03-02
      • 2021-04-21
      相关资源
      最近更新 更多