Возникла проблема с 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 (вы можете добавить туда любой каталог)