Elixir CRC 无法在 MAC 操作系统上编译
Posted
技术标签:
【中文标题】Elixir CRC 无法在 MAC 操作系统上编译【英文标题】:Elixir CRC will not compile on MAC OS 【发布时间】:2020-10-30 12:31:10 【问题描述】:我的 elixir 项目间接使用了具有 NIF 的 crc。他们不会编译。看起来链接的人看不到库。
rtp_to_hls ● rm -rf deps/ _build/ && mix deps.get && mix compile
==> crc
C checksum_xor.c
C crc_8.c
C crc_algorithm.c
C crc_model.c
C crc_nif.c
C crc_resource.c
C xnif_slice.c
LD crc_nif.so
Undefined symbols for architecture x86_64:
"_enif_alloc", referenced from:
_crc_model_load in crc_model.o
_kh_resize_crc_stubs in crc_model.o
_kh_resize_crc_models in crc_model.o
_crc_nif_debug_table_1 in crc_nif.o
"_enif_alloc_resource", referenced from:
_crc_resource_create in crc_resource.o
_crc_resource_clone in crc_resource.o
_xnif_slice_create in xnif_slice.o
_xnif_slice_create_x in xnif_slice.o
"_enif_consume_timeslice", referenced from:
_xnif_slice_trap in xnif_slice.o
"_enif_free", referenced from:
_crc_model_load in crc_model.o
_crc_model_unload in crc_model.o
_kh_resize_crc_stubs in crc_model.o
_kh_resize_crc_models in crc_model.o
_crc_nif_debug_table_1 in crc_nif.o
"_enif_get_map_size", referenced from:
_crc_init in crc_nif.o
_crc_init_map_extend in crc_nif.o
"_enif_get_map_value", referenced from:
_crc_init in crc_nif.o
_crc_init_map_extend in crc_nif.o
"_enif_get_resource", referenced from:
_crc_resource_get in crc_resource.o
_xnif_slice_trap in xnif_slice.o
"_enif_get_tuple", referenced from:
_crc_init_tuple in crc_nif.o
"_enif_get_uint", referenced from:
_crc_nif_checksum_xor_1_work in checksum_xor.o
_crc_nif_checksum_xor_1_done in checksum_xor.o
_crc_nif_crc_8_2 in crc_8.o
_crc_nif_crc_8_init_1 in crc_8.o
_crc_nif_crc_8_update_2 in crc_8.o
_crc_nif_crc_8_final_1 in crc_8.o
_crc_nif_crc_8_2_work in crc_8.o
...
"_enif_get_ulong", referenced from:
_crc_init_tuple in crc_nif.o
"_enif_inspect_binary", referenced from:
_crc_nif_checksum_xor_1 in checksum_xor.o
_crc_nif_checksum_xor_1_work in checksum_xor.o
_crc_nif_crc_8_2 in crc_8.o
_crc_nif_crc_8_update_2 in crc_8.o
_crc_nif_crc_8_2_work in crc_8.o
_crc_nif_crc_8_update_2_work in crc_8.o
"_enif_inspect_iolist_as_binary", referenced from:
_crc_nif_crc_fast_2 in crc_nif.o
_crc_nif_crc_fast_update_2 in crc_nif.o
_crc_nif_crc_slow_2 in crc_nif.o
_crc_nif_crc_slow_update_2 in crc_nif.o
_crc_nif_crc_fast_2_work in crc_nif.o
_crc_nif_crc_fast_update_2_work in crc_nif.o
_crc_nif_crc_slow_2_work in crc_nif.o
...
"_enif_is_atom", referenced from:
_crc_init in crc_nif.o
"_enif_is_map", referenced from:
_crc_init in crc_nif.o
"_enif_is_ref", referenced from:
_crc_init in crc_nif.o
"_enif_is_tuple", referenced from:
_crc_init in crc_nif.o
"_enif_keep_resource", referenced from:
_crc_resource_create in crc_resource.o
_crc_resource_clone in crc_resource.o
"_enif_make_atom", referenced from:
_crc_model_load in crc_model.o
_crc_model_list in crc_model.o
_crc_nif_make_atoms in crc_nif.o
"_enif_make_badarg", referenced from:
_crc_nif_checksum_xor_1 in checksum_xor.o
_crc_nif_checksum_xor_1_done in checksum_xor.o
_crc_nif_crc_8_2 in crc_8.o
_crc_nif_crc_8_init_1 in crc_8.o
_crc_nif_crc_8_update_2 in crc_8.o
_crc_nif_crc_8_final_1 in crc_8.o
_crc_nif_crc_8_2_done in crc_8.o
...
"_enif_make_list_from_array", referenced from:
_crc_nif_debug_table_1 in crc_nif.o
"_enif_make_map_put", referenced from:
_crc_model_list in crc_model.o
_crc_nif_crc_info_1 in crc_nif.o
"_enif_make_new_binary", referenced from:
_crc_model_list in crc_model.o
_crc_nif_crc_info_1 in crc_nif.o
"_enif_make_new_map", referenced from:
_crc_model_list in crc_model.o
_crc_nif_crc_info_1 in crc_nif.o
"_enif_make_resource", referenced from:
_crc_nif_crc_fast_2 in crc_nif.o
_crc_nif_crc_fast_init_1 in crc_nif.o
_crc_nif_crc_fast_update_2 in crc_nif.o
_crc_nif_crc_slow_2 in crc_nif.o
_crc_nif_crc_slow_init_1 in crc_nif.o
_crc_nif_crc_slow_update_2 in crc_nif.o
_xnif_slice_schedule in xnif_slice.o
...
"_enif_make_tuple", referenced from:
_crc_nif_debug_table_1 in crc_nif.o
_crc_init in crc_nif.o
_crc_init_map_extend in crc_nif.o
"_enif_make_uint", referenced from:
_crc_nif_checksum_xor_1 in checksum_xor.o
_crc_nif_checksum_xor_1_work in checksum_xor.o
_crc_nif_checksum_xor_1_done in checksum_xor.o
_crc_nif_crc_8_2 in crc_8.o
_crc_nif_crc_8_init_1 in crc_8.o
_crc_nif_crc_8_update_2 in crc_8.o
_crc_nif_crc_8_final_1 in crc_8.o
...
"_enif_make_ulong", referenced from:
_crc_nif_debug_table_1 in crc_nif.o
_crc_nif_crc_fast_2 in crc_nif.o
_crc_nif_crc_fast_final_1 in crc_nif.o
_crc_nif_crc_slow_2 in crc_nif.o
_crc_nif_crc_slow_final_1 in crc_nif.o
_crc_nif_crc_info_1 in crc_nif.o
_crc_nif_crc_residue_1 in crc_nif.o
...
"_enif_monotonic_time", referenced from:
_xnif_slice_trap in xnif_slice.o
"_enif_open_resource_type", referenced from:
_crc_resource_load in crc_resource.o
_crc_resource_upgrade in crc_resource.o
_xnif_slice_load in xnif_slice.o
_xnif_slice_upgrade in xnif_slice.o
"_enif_realloc", referenced from:
_kh_resize_crc_stubs in crc_model.o
_kh_resize_crc_models in crc_model.o
"_enif_release_resource", referenced from:
_crc_nif_crc_fast_2 in crc_nif.o
_crc_nif_crc_fast_init_1 in crc_nif.o
_crc_nif_crc_fast_update_2 in crc_nif.o
_crc_nif_crc_slow_2 in crc_nif.o
_crc_nif_crc_slow_init_1 in crc_nif.o
_crc_nif_crc_slow_update_2 in crc_nif.o
_crc_nif_crc_residue_1 in crc_nif.o
...
"_enif_schedule_nif", referenced from:
_xnif_slice_schedule in xnif_slice.o
_xnif_slice_trap in xnif_slice.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/Users/hajtojakub/Projects/membrane-demo/rtp_to_hls/_build/dev/lib/crc/priv/crc_nif.so] Error 1
could not compile dependency :crc, "mix compile" failed. You can recompile this dependency with "mix deps.compile crc", update it with "mix deps.update crc" or clean it with "mix deps.clean crc"
==> membrane_demo_rtp_to_hls
** (Mix) Could not compile with "make" (exit status: 2).
You need to have gcc and make installed. Try running the
commands "gcc --version" and / or "make --version". If these programs
are not installed, you will be prompted to install them.
我开始检查环境:
rtp_to_hls ● gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
rtp_to_hls ● make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
这很可能是配置问题。我将发布最小的可重现项目
【问题讨论】:
CRC 使用什么库?我猜这个:github.com/TattdCodeMonkey/crc 你使用的是最新版本吗?如果您克隆 repo 并运行mix do deps.get, compile
是否有效?
不。我已经完成了清洁,混合 deps.clean 多次。正如您在第一篇文章中看到的那样,我使用了rm -rf deps/ _build/ && mix deps.get && mix compile
。所以输出是新的部门。
【参考方案1】:
您需要安装erlang 开发库,其中声明了这个_enif_***
系列函数。
在 Debian Linux 上:
通过Erlang Solutions——首选 使用发行版回购:sudo apt install erlang-dev
对于 MacOS,Erlang Solutions 只提供古老的 OTP 版本 19.3,我不知道 brew
是否提供最新的 OTP。如果是,请执行brew install erlang-r23-dev
或类似操作。如果没有,您可能可以自己编译erlang。
注意请参考下面非常有价值的评论,看看如何教 MacOS 已经安装了dev
版本。
【讨论】:
我知道。但在 Mac OS 上,您不必单独安装它们。在安装结束时,我收到以下消息: 使用erl -man
访问它们,或将此目录添加到MANPATH。 erlang@22 仅是小桶,这意味着它没有符号链接到 /usr/local,因为这是另一个公式的替代版本。如果你需要 erlang@22 首先在你的 PATH 运行: echo 'export PATH="/usr/local/opt/erlang@22/bin:$PATH"' >> ~/.zshrc 让编译器找到 erlang@22您可能需要设置:export LDFLAGS="-L/usr/local/opt/erlang@22/lib"
我已将这两个导出都添加到 ~/.zshrc
哎哟。 MacOS 对开发者从来都不友好。为了保持 Linux 的正确答案和您对 MacOS 的评论,我将把这个答案留在这里。还有.zshrc
太具体了,应该是“你的shell资源文件”。以上是关于Elixir CRC 无法在 MAC 操作系统上编译的主要内容,如果未能解决你的问题,请参考以下文章
我无法在我的 ubuntu 18.10 cosmic 系统上安装 erlang/Elixir
使用 Qt 时,我是不是必须在特定操作系统上编译特定操作系统?