MickeyOoh
Undefined error of "enif_make_string" happens to erlang nif function
I am checking Nif function following Erlang erl_nif document and having an issue of compile error.
Could you please help me to solve this issue?
/* niftest.c */
#include <erl_nif.h>
static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{ return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1); }
static ErlNifFunc nif_funcs[] = { {"hello", 0, hello} };
ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)
compiling
$> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/
Undefined symbols for architecture x86_64:
“_enif_make_string”, referenced from:
_hello in niftest-cb9456.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
machine: macOS Monetery
gcc: Apple clang version 13.1.6 (clang-1316.0.21.2)
erlang: 24.3
include file: ERL_ROOT=~/.asdf/installs/erlang/24.3
It is where undefined symbol “enif_make_string” is defined.
erl_nif_api_funcs.h
#ifdef ERL_NIF_API_FUNC_DECL
ERL_NIF_API_FUNC_DECL(
ERL_NIF_TERM,
enif_make_string,
(ErlNifEnv* env, const char* string, ErlNifCharEncoding)
);
#endif
#ifdef ERL_NIF_API_FUNC_MACRO
#define enif_make_string ERL_NIF_API_FUNC_MACRO(enif_make_string)
#endif
The following is where two switching Macros is defined.
ERL_NIF_API_FUNC_DECL, ERL_NIF_API_FUNC_MACRO
erl_nif.h
#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
#define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) RET_TYPE (*NAME) ARGS typedef struct {
#include "erl_nif_api_funcs.h"
void* erts_alc_test;
} TWinDynNifCallbacks;
extern TWinDynNifCallbacks WinDynNifCallbacks;
#undef ERL_NIF_API_FUNC_DECL
#endif
#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
&& !defined(STATIC_ERLANG_DRIVER) && !defined(STATIC_ERLANG_NIF)
#define ERL_NIF_API_FUNC_MACRO(NAME) (WinDynNifCallbacks.NAME)
#include "erl_nif_api_funcs.h"
/* note that we have to keep ERL_NIF_API_FUNC_MACRO defined */
#else /* non windows or included from emulator itself */
#define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) extern RET_TYPE NAME ARGS
#include "erl_nif_api_funcs.h"
#undef ERL_NIF_API_FUNC_DECL
#endif
I couldn’t find switching macros of “__WIN32__” anywhere although this looks WindowsOS macro.
This issue happened on Erlang 23.x and I installed 24.3. So installation doesn’t cause this.
Please help me to find what I am missing.
Thanks.
Marked As Solved
garazdawi
After checking again I think the -bundle is supposed to replace the -shared for clang. Does that work for you?
Also Liked
garazdawi
On MacOS you also need to pass -bundle -bundle_loader $ERL_ROOT/erts-*/bin/beam.smp to gcc/clang in order for it to work.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









