Módulo PHP V8js no Linux - não consigo encontrar libv8.so

5

Correndo em um problema com o v8js-0.1.2 (beta) - Estou vendo outros terem sucesso na rede, mas independentemente de qual plataforma / SO eu estou rodando, eu sempre enfrento o mesmo problema.

No momento, estou tentando criar o módulo, diretamente por meio de pecl , e criando depois de usar phpize na origem. Ele encontra a instalação do V8, configure é bem-sucedida e, em seguida, make erros:

/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

Se eu adicionar #define PHP_V8_VERSION "0.1.2" no v8js.cc, eu obtenho:

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

que é make de reclamação porque não está usando o caminho lib da v8 fornecido e está tentando encontrar libv8.so no caminho padrão da biblioteca. Se eu ligar symlink no lugar, eu recebo:

/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

quando libv8.a é diretamente do V8 recém-compilado. Alguém tem algum pensamento?

Adendo: eu teria marcado esse v8 e v8js , mas ainda não tenho representação suficiente. Desculpa! : (

Editar:

Depois de tentar reconstruir o V8 (via scons) com library=shared , tenho mais problemas:

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.

Devo estar usando uma versão do V8 diferente da mais recente? Além disso, se eu deixar como está (estático, usando libv8.a), é possível usar um módulo PHP estático? Por alguma razão, executar configure na fonte v8js-0.1.2 NÃO me permite desabilitar o compartilhamento e habilitar estático; ambos estão habilitados por padrão, e passar --disabled-shared ou --enable-shared=no (oposto ao valor padrão yes ) deixa o compartilhamento ativado e desativa a estática.

Editar 2:

Após 3 + horas de compilação repetida, o problema parece ser que você não pode habilitar sample=shell enquanto usa library=shared . Isso não parece razoável e o AFAICT é provavelmente um bug, no entanto, usando arch=x64 e library=shared funcionou para mim, e então eu consegui vincular libv8.so ao local correto e compilar a extensão PHP v8js.

O problema agora é que o PHP parece não conseguir encontrar o objeto compartilhado:

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

quando libv8.so reside em /usr/local/v8/libv8.so . Eu tentei anexar esse diretório a $PATH , vinculando libv8.so ao diretório de extensão, etc. Alguma idéia?

    
por mway 27.03.2011 / 10:03

2 respostas

2

script de configuração pode ter dificuldade em determinar a versão do V8 se você não tiver o V8 instalado no local normal (diretamente em / usr ou / usr / local). Eu usei:   export CXXFLAGS="- / usr / local / mydir / include -Wl, - rpath, / usr / local / mydir / lib" antes de executar o script de configuração (--with-v8js = / usr / local / mydir) para que ele possa encontrar a versão v8.

Realmente é um bug no v8js que o script de configuração não sai 1 quando não consegue encontrar a versão V8.

    
por 24.04.2011 / 01:54
0

Você precisa de libv8.so (biblioteca compartilhada, normalmente não é uma biblioteca compartilhada) em algum lugar onde ld a encontraria - em / usr / lib /, / usr / local / lib / ou em qualquer caminho especificado em / etc /ld.so.conf (você pode adicionar qualquer diretório que desejar)

    
por 27.03.2011 / 10:13