ошибка компилятора при установке rubygem 'mysql2' в Ruby 1.9.2 поверх CentOS 64-bit - PullRequest
2 голосов
/ 23 июня 2011

a CentOS 64-bit Сервер с Ruby 1.8.7 и 1.9.2

{{нет RVM, нужно без RVM ... в настоящее время все исполняемые файлы Ruby1.9.2 являются ruby19 и доступны аналогично, так что нет никакого отображения gem-path или чего-либо в этом роде}}

выдает ошибку при установке gem 'mysql2' ...

У меня установлены все зависимости и все 64-битные версии ...

Все ошибки имеют вид {./client.h:13: ошибка: переопределение typedef «Rb_unblock_function_t»}

Может {#warning rubysig.h устарел} быть причиной для этого?

Захват консоли:

#gem19 install mysql2 -v 0.2.7 -- --with-mysql-dir=/usr/bin --with-mysql-config=/usr/bin/mysql_config --with-mysql-include=/usr/include/mysql

Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
        ERROR: Failed to build gem native extension.

/usr/bin/ruby19 extconf.rb --with-mysql-dir=/usr/bin --with-mysql-config=/usr/bin/mysql_config --with-mysql-include=/usr/include/mysql
checking for rb_thread_blocking_region()... no
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
creating Makefile

make
gcc -I. -I/usr/include/ruby-1.9.1/x86_64-linux -I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I. -DHAVE_MYSQL_H -DHAVE_ERRMSG_H -DHAVE_MYSQLD_ERROR_H    -I/usr/include/mysql  -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -mtune=generic -Wall -fno-strict-aliasing -fPIC -Wall -funroll-loops  -o result.o -c result.c
In file included from ./client.h:11,
                 from ./mysql2_ext.h:39,
                 from result.c:1:
/usr/include/ruby-1.9.1/ruby/backward/rubysig.h:14:2: warning: #warning rubysig.h is obsolete
In file included from ./mysql2_ext.h:39,
                 from result.c:1:
./client.h:13: error: redefinition of typedef ‘rb_unblock_function_t’
/usr/include/ruby-1.9.1/ruby/intern.h:754: error: previous declaration of ‘rb_unblock_function_t’ was here
./client.h:14: error: redefinition of typedef ‘rb_blocking_function_t’
/usr/include/ruby-1.9.1/ruby/intern.h:755: error: previous declaration of ‘rb_blocking_function_t’ was here
./client.h:20: error: static declaration of ‘rb_thread_blocking_region’ follows non-static declaration
/usr/include/ruby-1.9.1/ruby/intern.h:759: error: previous declaration of ‘rb_thread_blocking_region’ was here
./client.h: In function ‘rb_thread_blocking_region’:
./client.h:23: warning: ‘rb_thread_blocking_region_begin’ is deprecated (declared at /usr/include/ruby-1.9.1/ruby/backward/rubysig.h:31)
./client.h:25: warning: ‘rb_thread_blocking_region_end’ is deprecated (declared at /usr/include/ruby-1.9.1/ruby/backward/rubysig.h:32)
In file included from ./mysql2_ext.h:39,
                 from result.c:1:
./client.h:41:7: warning: no newline at end of file
make: *** [result.o] Error 1

Ответы [ 3 ]

7 голосов
/ 24 января 2013

Это вызвано патчем, который они добавили в гем для запуска в Ruby 1.8, но он не нужен в Ruby 1.9.

Чтобы деактивировать это «исправление» и установить гем, вы можете определить флаг для компилятора:

gem install mysql2 -- --with-cflags=\"-DHAVE_RB_THREAD_BLOCKING_REGION\"
1 голос
/ 30 июня 2012

Проблема в разделе extconf / mkmf:

rb_thread_blocking_region () ... нет

Но Ruby 1.9.2 определяет rb_thread_blocking_region (если вы не создали Ruby с каким-то забавным набором ifdef и правок, о которых я не знаю).

Проверьте ваш файл mkmf.log. Это должно показать вам, что Ruby не удалось скомпилировать / связать файл conftest.c, который проверяет rb_thread_blocking_region. Причина в том, что libcrypt.a имеет зависимость от libfreebl3, но библиотека не получает ссылка на ссылку линии.

Я исправил проблему, отредактировав /usr/local/lib/ruby/1.9.1/i686-linux/rbconfig.rb примерно так:

-  CONFIG["LIBS"] = "-lpthread -lrt -ldl -lcrypt -lm "
+  CONFIG["LIBS"] = "-lpthread -lrt -ldl -lcrypt -lfreebl3 -lm "

Я смог собрать драгоценный камень mysql2 после. Не нужно устанавливать rvm и т. Д.

0 голосов
/ 26 июня 2011

Что я сделал, чтобы это исправить, так это переустановил Ruby через RVM. После этого больше нет ошибок.

В качестве альтернативы, удалите блок в client.h, который пытается эмулировать rb_thread_blocking_region для Ruby 1.8, и все будет хорошо.

...