elixir-sippet icon indicating copy to clipboard operation
elixir-sippet copied to clipboard

Fix nif build for macOS

Open dnsbty opened this issue 3 months ago • 0 comments

My computer has the following specs:

Model Name: MacBook Pro Model Identifier: MacBookPro18,4 Chip: Apple M1 Max System Version: macOS 15.6.1 (24G90) Kernel Version: Darwin 24.6.0

When building on my machine, I was getting the following errors:

/usr/bin/clang -I/opt/homebrew/opt/unixodbc/include /Users/dennisbeatty/Code/sip_proxy/deps/sippet/c_src/string_piece.o /Users/dennisbeatty/Code/sip_proxy/deps/sippet/c_src/utils.o /Users/dennisbeatty/Code/sip_proxy/deps/sippet/c_src/parser.o /Users/dennisbeatty/Code/sip_proxy/deps/sippet/c_src/tokenizer.o /Users/dennisbeatty/Code/sip_proxy/deps/sippet/c_src/prtime.o -L/opt/homebrew/opt/unixodbc/lib -shared -lstdc++ -L /Users/dennisbeatty/.local/share/mise/installs/erlang/28.0.2/usr/lib -lei -o /Users/dennisbeatty/Code/sip_proxy/deps/sippet/priv/sippet_nif.so
Undefined symbols for architecture arm64:
  "_enif_alloc_binary", referenced from:
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSchemeAndAuthParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseStarOrMultipleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseCseq(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseTrimmedUtf8(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
  "_enif_get_list_cell", referenced from:
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
  "_enif_get_map_value", referenced from:
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
  "_enif_get_tuple", referenced from:
      (anonymous namespace)::ParseSingleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleVias(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
  "_enif_inspect_binary", referenced from:
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
  "_enif_is_atom", referenced from:
      (anonymous namespace)::ParseMultipleTypeSubtypeParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokenParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokens(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSchemeAndAuthParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSchemeAndAuthParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
  "_enif_is_binary", referenced from:
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
  "_enif_is_list", referenced from:
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
  "_enif_make_atom", referenced from:
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      _on_load in parser.o
      ...
  "_enif_make_badarg", referenced from:
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
  "_enif_make_binary", referenced from:
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSchemeAndAuthParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseStarOrMultipleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseCseq(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseTrimmedUtf8(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
  "_enif_make_double", referenced from:
      (anonymous namespace)::ParseTimestamp(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseTimestamp(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
  "_enif_make_existing_atom_len", referenced from:
      (anonymous namespace)::MakeLowerCaseExistingAtom(enif_environment_t*, StringPiece, unsigned long*) in parser.o
  "_enif_make_int", referenced from:
      (anonymous namespace)::ParseSingleInteger(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseCseq(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseDate(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
  "_enif_make_list", referenced from:
      (anonymous namespace)::ParseMultipleTypeSubtypeParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokenParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokens(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSchemeAndAuthParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleVias(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
  "_enif_make_list_cell", referenced from:
      (anonymous namespace)::ParseMultipleTypeSubtypeParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokenParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokens(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleVias(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleWarnings(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
  "_enif_make_map_put", referenced from:
      (anonymous namespace)::ParseParameters(enif_environment_t*, Tokenizer*) in parser.o
      (anonymous namespace)::ParseAuthParams(enif_environment_t*, Tokenizer*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      ...
  "_enif_make_new_map", referenced from:
      (anonymous namespace)::ParseRetryAfter(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseParameters(enif_environment_t*, Tokenizer*) in parser.o
      (anonymous namespace)::ParseAuthParams(enif_environment_t*, Tokenizer*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      parse_wrapper(enif_environment_t*, int, unsigned long const*) in parser.o
      ...
  "_enif_make_reverse_list", referenced from:
      (anonymous namespace)::ParseMultipleTypeSubtypeParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokenParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleTokens(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleContactParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleVias(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseMultipleWarnings(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
  "_enif_make_tuple", referenced from:
      (anonymous namespace)::ParseMultipleUriParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSchemeAndAuthParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleTokenParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleTypeSubtypeParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleTypeSubtypeParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseSingleTypeSubtypeParams(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      (anonymous namespace)::ParseCseq(enif_environment_t*, std::__1::__wrap_iter<char const*>, std::__1::__wrap_iter<char const*>) in parser.o
      ...
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/Users/dennisbeatty/Code/sip_proxy/deps/sippet/priv/sippet_nif.so] Error 1
could not compile dependency :sippet, "mix compile" failed. Errors may have been logged above. You can recompile this dependency with "mix deps.compile sippet --force", update it with "mix deps.update sippet" or clean it with "mix deps.clean sippet"

After following the recommendations in this thread, I was able to build as expected. This brings those changes into sippet for others using macOS.

dnsbty avatar Sep 28 '25 18:09 dnsbty