Назад | Перейти на главную страницу

Модуль PHP V8js в Linux - не удается найти libv8.so

Возникла проблема с v8js-0.1.2 (бета) - я вижу, что другие добиваются успеха в сети, но независимо от того, на какой платформе / ОС я работаю, я всегда сталкиваюсь с одной и той же проблемой.

В настоящее время я пытаюсь создать модуль, как напрямую через pecl, и построение после использования phpize на источнике. Он находит установку V8, configure успешно, а затем make ошибки:

/usr/local/src/v8js-0.1.2/v8js.cc: In function 'int zm_startup_v8js(int, int)':
/usr/local/src/v8js-0.1.2/v8js.cc:1135: error: 'PHP_V8_VERSION' was not declared in this scope
/usr/local/src/v8js-0.1.2/v8js.cc: In function 'void zm_info_v8js(zend_module_entry*)':
/usr/local/src/v8js-0.1.2/v8js.cc:1231: error: 'PHP_V8_VERSION' was not declared in this scope
make: *** [v8js.lo] Error 1

Если я добавлю #define PHP_V8_VERSION "0.1.2" в v8js.cc я получаю:

/usr/bin/ld: cannot find -lv8
collect2: ld returned 1 exit status
make: *** [v8js.la] Error 1

который make жалуется, потому что он не использует предоставленный путь v8 lib и вместо этого пытается найти libv8.so в пути к библиотеке по умолчанию. Если я сделаю символическую ссылку на место, я получу:

/usr/bin/ld: skipping incompatible /usr/local/lib/libv8.a when searching for -lv8
/usr/bin/ld: cannot find -lv8
collect2: ld returned 1 exit status
make: *** [v8js.la] Error 1

когда libv8.a прямо из недавно скомпилированного V8. У кого-нибудь есть мысли?

Приложение: я бы отметил это v8 и v8js но мне пока не хватает репутации. Сожалею! :(

Редактировать:

После попытки восстановить V8 (через scons) с помощью library=shared, У меня больше проблем:

obj/sample/shell/release/shell.o: In function `RunMain(int, char**)':
shell.cc:(.text+0xf14): undefined reference to `v8::internal::Thread::Join()'
shell.cc:(.text+0xff4): undefined reference to `v8::internal::Thread::Thread(v8::internal::Isolate*, v8::internal::Thread::Options const&)'
shell.cc:(.text+0x1008): undefined reference to `v8::internal::Thread::Start()'
shell.cc:(.text+0x10a3): undefined reference to `v8::internal::OS::CreateSemaphore(int)'
shell.cc:(.text+0x10b2): undefined reference to `v8::internal::OS::CreateSemaphore(int)'
obj/sample/shell/release/shell.o: In function `SourceGroup::IsolateThread::~IsolateThread()':
shell.cc:(.text._ZN11SourceGroup13IsolateThreadD0Ev[SourceGroup::IsolateThread::~IsolateThread()]+0x14): undefined reference to `v8::internal::Thread::~Thread()'
obj/sample/shell/release/shell.o: In function `SourceGroup::IsolateThread::~IsolateThread()':
shell.cc:(.text._ZN11SourceGroup13IsolateThreadD1Ev[SourceGroup::IsolateThread::~IsolateThread()]+0xe): undefined reference to `v8::internal::Thread::~Thread()'
collect2: ld returned 1 exit status
scons: *** [shell] Error 1
scons: building terminated because of errors.

Должен ли я использовать версию V8, отличную от последней? Кроме того, если я оставил его как есть (статический, с использованием libv8.a), можно ли вместо этого использовать статический модуль PHP? По какой-то причине бег configure в источнике v8js-0.1.2 НЕ позволяет мне отключить общий доступ и включить статический; они оба включены по умолчанию и передают --disabled-shared или --enable-shared=no (противоположно дефолту yes value) оставляет общий доступ включенным и отключает статический.

Изменить 2:

После трех с лишним часов повторной компиляции проблема, похоже, заключается в том, что вы не можете одновременно включить sample=shell при использовании library=shared. Это не кажется разумным, и AFAICT, скорее всего, является ошибкой, однако использование arch=x64 и library=shared работал у меня, а затем я смог связать libv8.so в нужное место и скомпилируйте расширение PHP v8js.

Проблема в том, что PHP, похоже, не может найти общий объект:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php-5.3.6/lib/php/extensions/no-debug-non-zts-20090626/v8js.so' - libv8.so: cannot open shared object file: No such file or directory in Unknown on line 0

когда libv8.so находится в /usr/local/v8/libv8.so. Я пробовал добавить этот каталог в $PATH, связывание libv8.so с каталогом расширений и т. д. Есть идеи?

Сценарию configure может быть сложно определить версию V8, если V8 не установлен в обычном месте (непосредственно в / usr или / usr / local). Я использовал: export CXXFLAGS = "- I / usr / local / mydir / include -Wl, - rpath, / usr / local / mydir / lib" перед запуском скрипта настройки (--with-v8js = / usr / local / mydir), чтобы он смог найти версию v8.

На самом деле это ошибка в v8js, что сценарий configure не завершает работу 1, когда не может найти версию V8.

Вам понадобится libv8.so (разделяемая библиотека, .a обычно не является разделяемой библиотекой) где-нибудь, где ld найдет ее - в / usr / lib /, / usr / local / lib / или по любому пути, указанному в / etc / ld. so.conf (вы можете добавить туда любой каталог)