bson_ext gem 在 macOS 上安装失败
bson_ext gem install fails on macOS
我无法安装 bson_ext gem 1.5.1 版本。我已经尝试了几乎所有我在网上找到的东西,但没有任何帮助。
我尝试重新安装 ruby、rvm 等。
我正在使用:
- RVM
- MacOs Catalina 10.15.6
- ruby2.6.5
捆绑安装后我得到了这样的日志:
Fetching bson_ext 1.5.1
Installing bson_ext 1.5.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
/Users/lukasz/.rvm/rubies/ruby-2.6.5/bin/ruby -I /Users/lukasz/.rvm/rubies/ruby-2.6.5/lib/ruby/site_ruby/2.6.0 -r ./siteconf20201001-15946-1sze5ll.rb extconf.rb
checking for asprintf()... yes
checking for ruby/st.h... yes
checking for ruby/regex.h... yes
checking for ruby/encoding.h... yes
creating Makefile
current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
make "DESTDIR=" clean
current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
make "DESTDIR="
compiling bson_buffer.c
compiling cbson.c
cbson.c:118:36: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1003:5: note: expanded from macro 'RSTRING_PTR'
(!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./encoding_helpers.h:26:44: note: passing argument to parameter 'string' here
result_t check_string(const unsigned char* string, const int length,
^
cbson.c:118:57: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1000:6: note: expanded from macro 'RSTRING_LEN'
RSTRING_EMBED_LEN(str) : \
^~~~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:996:6: note: expanded from macro 'RSTRING_EMBED_LEN'
(long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cbson.c:118:57: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1001:28: note: expanded from macro 'RSTRING_LEN'
RSTRING(str)->as.heap.len)
~~~~~~~~~~~~~~~~~~~~~~^~~
cbson.c:128:45: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LEN(string));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1000:6: note: expanded from macro 'RSTRING_LEN'
RSTRING_EMBED_LEN(str) : \
^
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:996:6: note: expanded from macro 'RSTRING_EMBED_LEN'
(long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
if (bson_buffer_write((buffer), (data), (size)) != 0) \
~~~~~~~~~~~~~~~~~ ^~~~
cbson.c:128:45: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LEN(string));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1001:28: note: expanded from macro 'RSTRING_LEN'
RSTRING(str)->as.heap.len)
^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
if (bson_buffer_write((buffer), (data), (size)) != 0) \
~~~~~~~~~~~~~~~~~ ^~~~
cbson.c:303:20: warning: unused variable 'values' [-Wunused-variable]
VALUE* values;
^
cbson.c:602:18: error: implicit declaration of function 'bson_buffer_get_max_size' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
if (length > bson_buffer_get_max_size(buffer)) {
^
cbson.c:602:18: note: did you mean 'bson_buffer_set_max_size'?
./bson_buffer.h:34:6: note: 'bson_buffer_set_max_size' declared here
void bson_buffer_set_max_size(bson_buffer_t buffer, int max_size);
^
6 warnings and 1 error generated.
make: *** [cbson.o] Error 1
make failed, exit code 2
Gem files will remain installed in /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1 for inspection.
Results logged to /Users/lukasz/.rvm/gems/ruby-2.6.5/extensions/x86_64-darwin-19/2.6.0/bson_ext-1.5.1/gem_make.out
An error occurred while installing bson_ext (1.5.1), and Bundler cannot continue.
Make sure that `gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/'` succeeds before bundling.
In Gemfile:
bson_ext
有人知道我还能尝试什么吗?
另外我可以说 bson_ext 和其他版本如 1.9.1 安装成功。但是在这个项目中我必须使用 1.5.1.
安装 1.3.1 版本对我有用
1.5.1 已有 9 年历史,因此没有理由相信它应该有效。而且,事实上,它也因同样的错误而失败(Big Sur / 2.7.1 和 2.8.0)。
话虽如此,如果您 100% 坚持这样做,并且别无选择,例如更换雇主 and/or 一个有前途的软件考古学职业可以依靠,试试这个:
转到错误消息中指示的文件夹,/Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1 for inspection.
从那里转到 ext/cbson
并编辑文件 bson_buffer.h
。
您需要在文件顶部附近插入一行:
/* A buffer */
typedef struct bson_buffer* bson_buffer_t;
/* A position in the buffer */
typedef int bson_buffer_position;
/***** THE FOLLOWING IS THE LINE YOU NEED TO INSERT ****/
int bson_buffer_get_max_size(bson_buffer_t buffer);
/* Allocate and return a new buffer.
* Return NULL on allocation failure. */
bson_buffer_t bson_buffer_new(void);
运行 make
在该文件夹中。它应该只需要几个警告就可以工作。
之后,您仍然需要安装它。检查 gem help install
以了解有关该过程的详细信息。这是按照其说明进行的:
@ in bson_ext-1.5.1 $ gem spec ../../cache/bson_ext-1.5.1.gem --ruby > ../../specifications/bson_ext-1.5.1.gemspec
而且,确实:
@ in bson_ext-1.5.1 $ gem list bson_ext
*** LOCAL GEMS ***
bson_ext (1.5.1)
请注意,这又是在“原始”文件夹中。
即使在那之后,只是做 requite 'bson_ext' 对我不起作用并且 require 'bson' 抱怨它丢失了。根据该错误消息,您可能会通过移动获得成功——我想在这里非常具体地说明——某物、某物。
不能保证这会真正起作用。应该不是。
我找到了一个更好的解决方案,当你安装 gem 在末尾添加这个
-- --with-cflags="-Wno-error=implicit-function-declaration"
这对我在 MacOS 11.2 上有效。
gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/' -- --with-cflags="-Wno-error=implicit-function-declaration"
您确定您确实需要 gem 的那个版本,还是您的项目中只需要默认版本?
如果不是,您可以在 Gemfile 中显式设置 latest/installed 版本的 gem,例如:
gem list bson_ext
*** LOCAL GEMS ***
bson_ext (1.12.5)
# Gemfile
source 'https://rubygems.org'
gem 'bcrypt'
gem 'bson_ext', '~> 1.12.5'
当默认情况下 bundle install 尝试安装 bson_ext -v '1.5.1' 时,这对我在 MacOS BigSur 下有效,并退出并出现错误,如您的:
RSTRING(str)->as.heap.len)
^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
if (bson_buffer_write((buffer), (data), (size)) != 0) \
~~~~~~~~~~~~~~~~~ ^~~~
cbson.c:303:20: warning: unused variable 'values' [-Wunused-variable]
VALUE* values;
^
cbson.c:602:18: error: implicit declaration of function 'bson_buffer_get_max_size' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
if (length > bson_buffer_get_max_size(buffer)) {
^
cbson.c:602:18: note: did you mean 'bson_buffer_set_max_size'?
./bson_buffer.h:34:6: note: 'bson_buffer_set_max_size' declared here
void bson_buffer_set_max_size(bson_buffer_t buffer, int max_size);
^
6 warnings and 1 error generated.
make: *** [cbson.o] Error 1
make failed, exit code 2
我无法安装 bson_ext gem 1.5.1 版本。我已经尝试了几乎所有我在网上找到的东西,但没有任何帮助。 我尝试重新安装 ruby、rvm 等。
我正在使用:
- RVM
- MacOs Catalina 10.15.6
- ruby2.6.5
捆绑安装后我得到了这样的日志:
Fetching bson_ext 1.5.1
Installing bson_ext 1.5.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
/Users/lukasz/.rvm/rubies/ruby-2.6.5/bin/ruby -I /Users/lukasz/.rvm/rubies/ruby-2.6.5/lib/ruby/site_ruby/2.6.0 -r ./siteconf20201001-15946-1sze5ll.rb extconf.rb
checking for asprintf()... yes
checking for ruby/st.h... yes
checking for ruby/regex.h... yes
checking for ruby/encoding.h... yes
creating Makefile
current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
make "DESTDIR=" clean
current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
make "DESTDIR="
compiling bson_buffer.c
compiling cbson.c
cbson.c:118:36: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1003:5: note: expanded from macro 'RSTRING_PTR'
(!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./encoding_helpers.h:26:44: note: passing argument to parameter 'string' here
result_t check_string(const unsigned char* string, const int length,
^
cbson.c:118:57: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1000:6: note: expanded from macro 'RSTRING_LEN'
RSTRING_EMBED_LEN(str) : \
^~~~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:996:6: note: expanded from macro 'RSTRING_EMBED_LEN'
(long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cbson.c:118:57: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1001:28: note: expanded from macro 'RSTRING_LEN'
RSTRING(str)->as.heap.len)
~~~~~~~~~~~~~~~~~~~~~~^~~
cbson.c:128:45: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LEN(string));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1000:6: note: expanded from macro 'RSTRING_LEN'
RSTRING_EMBED_LEN(str) : \
^
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:996:6: note: expanded from macro 'RSTRING_EMBED_LEN'
(long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
if (bson_buffer_write((buffer), (data), (size)) != 0) \
~~~~~~~~~~~~~~~~~ ^~~~
cbson.c:128:45: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LEN(string));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1001:28: note: expanded from macro 'RSTRING_LEN'
RSTRING(str)->as.heap.len)
^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
if (bson_buffer_write((buffer), (data), (size)) != 0) \
~~~~~~~~~~~~~~~~~ ^~~~
cbson.c:303:20: warning: unused variable 'values' [-Wunused-variable]
VALUE* values;
^
cbson.c:602:18: error: implicit declaration of function 'bson_buffer_get_max_size' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
if (length > bson_buffer_get_max_size(buffer)) {
^
cbson.c:602:18: note: did you mean 'bson_buffer_set_max_size'?
./bson_buffer.h:34:6: note: 'bson_buffer_set_max_size' declared here
void bson_buffer_set_max_size(bson_buffer_t buffer, int max_size);
^
6 warnings and 1 error generated.
make: *** [cbson.o] Error 1
make failed, exit code 2
Gem files will remain installed in /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1 for inspection.
Results logged to /Users/lukasz/.rvm/gems/ruby-2.6.5/extensions/x86_64-darwin-19/2.6.0/bson_ext-1.5.1/gem_make.out
An error occurred while installing bson_ext (1.5.1), and Bundler cannot continue.
Make sure that `gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/'` succeeds before bundling.
In Gemfile:
bson_ext
有人知道我还能尝试什么吗? 另外我可以说 bson_ext 和其他版本如 1.9.1 安装成功。但是在这个项目中我必须使用 1.5.1.
安装 1.3.1 版本对我有用
1.5.1 已有 9 年历史,因此没有理由相信它应该有效。而且,事实上,它也因同样的错误而失败(Big Sur / 2.7.1 和 2.8.0)。
话虽如此,如果您 100% 坚持这样做,并且别无选择,例如更换雇主 and/or 一个有前途的软件考古学职业可以依靠,试试这个:
转到错误消息中指示的文件夹,/Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1 for inspection.
从那里转到 ext/cbson
并编辑文件 bson_buffer.h
。
您需要在文件顶部附近插入一行:
/* A buffer */
typedef struct bson_buffer* bson_buffer_t;
/* A position in the buffer */
typedef int bson_buffer_position;
/***** THE FOLLOWING IS THE LINE YOU NEED TO INSERT ****/
int bson_buffer_get_max_size(bson_buffer_t buffer);
/* Allocate and return a new buffer.
* Return NULL on allocation failure. */
bson_buffer_t bson_buffer_new(void);
运行 make
在该文件夹中。它应该只需要几个警告就可以工作。
之后,您仍然需要安装它。检查 gem help install
以了解有关该过程的详细信息。这是按照其说明进行的:
@ in bson_ext-1.5.1 $ gem spec ../../cache/bson_ext-1.5.1.gem --ruby > ../../specifications/bson_ext-1.5.1.gemspec
而且,确实:
@ in bson_ext-1.5.1 $ gem list bson_ext
*** LOCAL GEMS ***
bson_ext (1.5.1)
请注意,这又是在“原始”文件夹中。
即使在那之后,只是做 requite 'bson_ext' 对我不起作用并且 require 'bson' 抱怨它丢失了。根据该错误消息,您可能会通过移动获得成功——我想在这里非常具体地说明——某物、某物。 不能保证这会真正起作用。应该不是。
我找到了一个更好的解决方案,当你安装 gem 在末尾添加这个
-- --with-cflags="-Wno-error=implicit-function-declaration"
这对我在 MacOS 11.2 上有效。
gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/' -- --with-cflags="-Wno-error=implicit-function-declaration"
您确定您确实需要 gem 的那个版本,还是您的项目中只需要默认版本? 如果不是,您可以在 Gemfile 中显式设置 latest/installed 版本的 gem,例如:
gem list bson_ext
*** LOCAL GEMS ***
bson_ext (1.12.5)
# Gemfile
source 'https://rubygems.org'
gem 'bcrypt'
gem 'bson_ext', '~> 1.12.5'
当默认情况下 bundle install 尝试安装 bson_ext -v '1.5.1' 时,这对我在 MacOS BigSur 下有效,并退出并出现错误,如您的:
RSTRING(str)->as.heap.len)
^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
if (bson_buffer_write((buffer), (data), (size)) != 0) \
~~~~~~~~~~~~~~~~~ ^~~~
cbson.c:303:20: warning: unused variable 'values' [-Wunused-variable]
VALUE* values;
^
cbson.c:602:18: error: implicit declaration of function 'bson_buffer_get_max_size' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
if (length > bson_buffer_get_max_size(buffer)) {
^
cbson.c:602:18: note: did you mean 'bson_buffer_set_max_size'?
./bson_buffer.h:34:6: note: 'bson_buffer_set_max_size' declared here
void bson_buffer_set_max_size(bson_buffer_t buffer, int max_size);
^
6 warnings and 1 error generated.
make: *** [cbson.o] Error 1
make failed, exit code 2