【问题标题】:bson_ext gem install fails on macOSbson_ext gem 安装在 macOS 上失败
【发布时间】:2020-10-01 09:38:01
【问题描述】:

我坚持使用 1.5.1 版本安装 bson_ext gem。我已经尝试了几乎所有我在网上找到的东西,但没有任何帮助。 我尝试重新安装ruby、rvm等。

我正在使用:

  • RVM
  • MacOs Catalina 10.15.6
  • 红宝石 2.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。

【问题讨论】:

  • 您是否尝试按照以下输出中的建议运行单独的 gem install 命令? gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/'。有时它可能会给你一些额外的背景。

标签: ruby-on-rails macos rubygems bson bson-ext


【解决方案1】:

我找到了一个更好的解决方案,当你安装 gem 时在最后添加这个

-- --with-cflags="-Wno-error=implicit-function-declaration"

【讨论】:

  • 这里是完整的命令:gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/' -- --with-cflags="-Wno-error=implicit-function-declaration"
【解决方案2】:

这在 MacOS 11.2 上对我有用。

gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/' -- --with-cflags="-Wno-error=implicit-function-declaration"

【讨论】:

    【解决方案3】:

    1.5.1 已经 9 岁了,所以没有理由相信它应该可以工作。而且,事实上,它也因同样的错误而失败(Big Sur / 2.7.1 和 2.8.0)。

    话虽如此,如果你 100% 坚持这样做,并且没有其他选择,例如更换雇主和/或有前途的软件考古学职业可以依靠,试试这个:

    转到错误消息中指示的文件夹/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' 抱怨它丢失了。根据该错误消息,您可能会通过移动成功——我想在这里非常具体——somethingsomewhere。 不保证这会真正起作用。应该不会吧。

    【讨论】:

    • 很好的修复,我的规范文件夹中没有 gemspec 文件。我添加了名为 bson_ext-1.5.1.gemspec 的广告空文件,然后运行命令:$ gem spec ../../cache/bson_ext-1.5.1.gem --ruby > ../../specifications/bson_ext-1.5.1.gemspec
    【解决方案4】:

    安装 1.3.1 版本对我有用

    【讨论】:

    • 我明白,但我不能在这个项目中更改版本,我有义务使用 1.5.1
    【解决方案5】:

    您确定确实需要该 gem 的那个版本,还是只是您的项目中默认需要的版本? 如果没有,您可以在 Gemfile 中明确设置 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'
    

    这在 MacOS BigSur 下对我有效,默认情况下,bundle install 尝试安装 bson_ext -v '1.5.1',并退出时出现如下错误:

         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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2020-03-31
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      相关资源
      最近更新 更多