是否正确,从 Pepper 18 开始,我不需要 scons 构建系统来编译,而是使用 gcc(nacl-versions) 和 makefile?
此外,生成的 .nexe 文件是否可以在任何平台的网络服务器上运行,而不仅仅是在它编译的平台上运行?所以比如在mac os下开发编译native代码模块,生成一个32bit和一个64bit的nexe文件。我将加载此模块的网络服务器在 linux 上运行,并且仍将执行 32 位和 64 位版本的模块?
是否正确,从 Pepper 18 开始,我不需要 scons 构建系统来编译,而是使用 gcc(nacl-versions) 和 makefile?
此外,生成的 .nexe 文件是否可以在任何平台的网络服务器上运行,而不仅仅是在它编译的平台上运行?所以比如在mac os下开发编译native代码模块,生成一个32bit和一个64bit的nexe文件。我将加载此模块的网络服务器在 linux 上运行,并且仍将执行 32 位和 64 位版本的模块?
Native Client 构建系统
没有任何版本的 Native Client SDK 要求特定的构建系统;任何时候都可以使用 SCons、GNU Make、CMake,甚至只是 shell 脚本。换句话说,基于 gcc 和 GNU 工具链的编译器和工具独立于开发人员决定使用的构建系统。
但是,在 Native Client SDK 的 Pepper 版本 17 之前(包括在内),SDK 中的示例附带了 SCons 的构建文件,并且 SCons 包含在 SDK 中。从 Pepper 18 起,情况不再如此。相反,为示例提供的构建文件是用于 GNU Make 的 Makefile。
另请参阅 SDK 的 Pepper 18 版本的发行说明。
交叉编译
SDK 中提供的工具目前支持 32 位 x86 和 64 位 x86 架构。Web 服务器的平台并不重要,因为 Native Client 模块运行在客户端(即在浏览器中)。这意味着需要考虑两个系统:用户系统和开发人员系统。
在用户系统上,当 Chrome 在页面中遇到 Native Client 模块时,它会获取适用于该客户端上的浏览器的可执行文件(.nexe 文件)。因此,如果 64 位 Windows 上的用户访问该页面,则将获取 64 位二进制文件;如果用户使用的是 32 位 Mac,则获取 32 位二进制文件。有例外,我将在下面单独处理。Chrome 从清单文件中确定 32 位和 64 位 .nex 的名称。有关清单文件的描述和示例,请参阅 Native Client SDK 站点 (www.GoNaCl.com)
开发人员可以而且应该生成 32 位和 64 位可执行文件,而不管用于开发的操作系统和体系结构如何。在 Pepper 18 的示例/目录中运行“make”并查看发出的命令是了解如何执行此操作的便捷方式。例如,“make hello_world_glibc”输出的一部分内容如下:
i686-nacl-gcc -o hello_world_x86_32.nexe hello_world.c -m32 -O0 -g -pthread -O0 -g -Wno-long-long -Wall -lppapi
和
i686-nacl-gcc -o hello_world_x86_64.nexe hello_world.c -m64 -O0 -g -pthread -O0 -g -Wno-long-long -Wall -lppapi
第一行生成 32 位 .nexe;第二行生成 64 位 .nexe。重要的标志是 -m32/-m64,它指定架构 - 始终构建两者,以便客户端在 32 位和 64 位机器上都可以使用该应用程序。
从长远来看,只需要一种部署格式,并且将添加 ARM 作为直接支持的架构。有关详细信息,请参阅Portable Native Client项目。
下面是浏览器和客户端架构对 32/64 位的具体匹配:
因此,作为一般规则,Chrome 会获取与其自己的位时代相匹配的 .nexe - 除了在 64 位 Windows 上,Chrome 会获取 64 位 .nexe,尽管它本身是 32 位。