在32位系统上编译node.js

4

我需要在32位系统上编译node.js,以便与我已有的代码兼容。

我从nodejs.org获取了源代码并进行了编译。然后开始更改common.gypi文件中的164-166行。原来是:

164           [ 'target_arch=="x64"', {
165             'cflags': [ '-m64' ],
166             'ldflags': [ '-m64' ],
167           }],

现在它是:

164           [ 'target_arch=="x64"', {
165             'cflags': [ '-m32' ],
166             'ldflags': [ '-m32' ],
167           }],

当我试图再次制作时,我遇到了以下错误:
../deps/v8/src/execution.h:259:错误:整数常量对于 'long' 类型太大 ../deps/v8/src/execution.h:260:错误:整数常量对于 'long' 类型太大 ../deps/v8/src/execution.h:259:错误:常量表达式中不能出现函数调用 ../deps/v8/src/execution.h:260:错误:常量表达式中不能出现函数调用
这些错误是指这些行:
#ifdef V8_TARGET_ARCH_X64
  static const uintptr_t kInterruptLimit = V8_UINT64_C(0xfffffffffffffffe);
  static const uintptr_t kIllegalLimit = V8_UINT64_C(0xfffffffffffffff8);

我相信这段代码来自谷歌的v8源代码。

如果您能提供如何修复这些编译错误和/或在32位系统上编译64位node.js的任何建议,我将不胜感激。我所做的大部分研究都是关于如何在64位系统上编译32位东西。


1
只是想澄清一下:您正在使用x86_32,想生成一个x86_64版本的node吗?为什么不直接编译一个x86_32位的node.js呢? - phihag
@phihag请问您能告诉我在哪里可以找到x86_32的node.js吗?我已经尝试了谷歌搜索和查看nodejs.org,但只找到了这些其他版本的文件:http://nodejs.org/dist/v0.8.5/,但它没有明确说明是否适用于32位。我的老板让我完成这个任务,所以他可能有目的让我下载当前的源代码。我会确认一下是否允许使用x86_32位。感谢您的回复! - Dorothyy
添加了一个回答,描述如何为x86_32编译节点。请注意,设置交叉编译基础设施可能会非常复杂。如果遇到任何问题,请随时提出新问题和/或在我的答案下发表评论。 - phihag
1个回答

5

如果你想构建 x86_32 版本的 node,但修改的是错误目标结构的参数。相反,应该给 configure 脚本添加 --dest-cpu 参数,如下所示:

git clone git://github.com/joyent/node.git
cd node
./configure --prefix /usr/local --dest-cpu ia32
make

如果这些命令成功完成,./out/Release/node 中应该有一个可用的x86_32二进制文件:
~/node$ file -b ./out/Release/node
ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked
(uses shared libs), for GNU/Linux 2.6.26, (...), not stripped
~/node$ ./out/Release/node
> 1 + 1
2

您可以使用--prefix参数指定的路径,在正在运行的系统中安装它,使用sudo make install命令即可。

请注意,这需要设置一个工作的C和C++编译器。在Debian/Ubuntu上,使用sudo apt-get install build-essential(如果您正在交叉编译,则使用build-essential:i386)即可开始。在rpm-based发行版中,请尝试使用sudo yum groupinstall "Development Tools" "Development Libraries"命令。


请问,github.com/joyent/node.git 上的代码和nodejs.org上的当前64位源代码有什么区别?此外,当我尝试sudo make install时,遇到了这个错误:<br> IOError:[Errno 2]没有这样的文件或目录:'deps/uv/include/ares.h' 您能否重申一下您在上面指定的--prefix参数的前缀是什么意思?最后,请解释一下为什么我们需要/usr/local?非常感谢! - Dorothyy
它应该与git或(与架构无关的)源代码tarball一起正常工作(但我只测试了git版本)。检查ares.h是否存在。它似乎最近被移动了;你在这个tarball和git版本中都得到了错误吗? --prefix /usr/local意味着当您运行sudo make install时,node.js二进制文件将安装为/usr/local/bin/node。如果您想要,可以选择其他目录,但/usr/localFHS建议的目录。 - phihag
只是想让你知道,在git版本中没有ares.h,但在源代码tarbell中有。由于你的帮助,我已经完成了这个任务。谢谢!现在我正在研究找到最好的sqlite模块与node.js一起使用。在这些模块之间进行比较:https://github.com/joyent/node/wiki/Modules#wiki-db-sqlite - Dorothyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接