Linux 上的 V8js PHP 模块-找不到 libv8.so

Linux 上的 V8js PHP 模块-找不到 libv8.so

遇到 v8js-0.1.2(测试版)的问题 - 我看到网络上的其他人都成功了,但无论我运行的是什么平台/操作系统,我总是遇到同样的问题。

我目前正在尝试构建模块,既直接通过,也使用源代码pecl构建。它找到 V8 安装,成功,然后出现错误:phpizeconfiguremake

/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在默认的 lib 路径中查找。如果我将它符号链接到位,我会得到:

/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 时。有人有什么想法吗?

附录:我本来想标记这个v8v8js但我还没有足够的声望。抱歉!:(

编辑:

尝试使用重建 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)会使共享保持启用状态并禁用静态。

编辑2:

经过整整 3 个小时的反复编译,问题似乎是您无法sample=shell在使用的同时启用library=shared。这似乎不合理,据我所知,这可能是一个错误,但是,使用arch=x64library=shared对我来说是有效的,然后我能够链接libv8.so到正确的位置并编译 v8js PHP 扩展。

现在的问题是 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 链接到扩展目录等。有什么想法吗?

答案1

如果您没有在常用位置(直接在 /usr 或 /usr/local)安装 V8,configure 脚本可能很难确定 V8 版本。我在运行 configure 脚本( --with-v8js=/usr/local/mydir )之前使用了:export CXXFLAGS="-I/usr/local/mydir/include -Wl,--rpath,/usr/local/mydir/lib",以便它可以找到 v8 版本。

这实际上是 v8js 中的一个错误,当配置脚本无法找到 V8 版本时,它不会退出 1。

答案2

您需要将 libv8.so(共享库,.a 通常不是共享库)放在 ld 可以找到的地方 - 在 /usr/lib/、/usr/local/lib/ 或在 /etc/ld.so.conf 中指定的任何路径(您可以在那里添加任何您想要的目录)

相关内容