По какой-то причине компилятор C не понимает код, соответствующий стандарту C99; в частности, он не разрешает объявления переменных после первого оператора в функции.
Поскольку bcrypt_elixir имеет файл Makefile.win
, предполагая, что он успешно скомпилировался на Windows раньше, я не совсем понимаю почему это происходит, но в любом случае вы сможете исправить это, изменив bcrypt_nif.c
, изменив это:
static ERL_NIF_TERM bcrypt_gensalt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary csalt;
unsigned int log_rounds, minor;
if (argc != 3 || !enif_inspect_binary(env, argv[0], &csalt) ||
csalt.size != BCRYPT_MAXSALT ||
!enif_get_uint(env, argv[1], &log_rounds) ||
!enif_get_uint(env, argv[2], &minor))
return enif_make_badarg(env);
ERL_NIF_TERM output;
unsigned char *output_data = enif_make_new_binary(env, BCRYPT_SALTSPACE, &output);
bcrypt_initsalt(log_rounds, (uint8_t *)csalt.data, (char *)output_data, (uint8_t)minor);
return output;
}
на это:
static ERL_NIF_TERM bcrypt_gensalt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary csalt;
unsigned int log_rounds, minor;
/* added these two lines */
ERL_NIF_TERM output;
unsigned char *output_data;
if (argc != 3 || !enif_inspect_binary(env, argv[0], &csalt) ||
csalt.size != BCRYPT_MAXSALT ||
!enif_get_uint(env, argv[1], &log_rounds) ||
!enif_get_uint(env, argv[2], &minor))
return enif_make_badarg(env);
/* removed one line, and modified this line: */
output_data = enif_make_new_binary(env, BCRYPT_SALTSPACE, &output);
bcrypt_initsalt(log_rounds, (uint8_t *)csalt.data, (char *)output_data, (uint8_t)minor);
return output;
}
Могут быть другие места, где вам нужно сделать аналогичные изменения.