15

使用支持构建多个操作系统的代码库,只有在需要对 Emscripten 进行修改时,才明智地将它们集成到同一个代码库中,并在条件编译的帮助下让它继续在其他环境中工作。

但是,似乎没有关于该主题的任何文档,这对我来说似乎很差,我也找不到任何关于它的问题,这对我来说似乎很令人惊讶——我希望它是一个被广泛使用和记录的领域.

我怎样才能做到这一点?

(我看过tools/shared.py,这似乎暗示#ifdef EMSCRIPTEN#ifdef __EMSCRIPTEN__可以使用;我仍然在问这个问题以确定我是否正确,如果这是正确的做法,甚至应该使用哪个。)

4

3 回答 3

15

根据Detecting Emscripten in preprocessor,使用的正确定义是__EMSCRIPTEN__.

2016 年 10 月,引入了严格的构建模式,启用后会删除EMSCRIPTEN定义。因此,即使它在非严格构建模式下仍然有效,也不建议使用。EMSCRIPTEN

于 2017-01-06T14:54:43.480 回答
5

#ifdef EMSCRIPTEN是AFAIK的首选方式。

在将源代码与#ifdefs 混淆之前,请考虑拥有某些平台相关文件并让构建工具完成工作是否更有意义。

此外,emscripten已经定义了LINUX,因为它的处理方式非常类似于 Linux 系统。通常这种行为已经解决了平台处理的大部分需求。

于 2013-06-12T15:56:50.067 回答
2

这是我目前的解决方案:

  • 我有一个带有通常目标的 linux Makefile,它链接了一个先前生成的静态库并输出一个可执行文件。

  • 该代码作用于带有 ifdefs 的 WEB 定义。

  • 库的 Makefile 作用于平台特定源的 TARGET 环境变量:

    ifeq ($(TARGET),WEB)
        MODULES = RenderingEngine2.o RenderingEngine1.o WebApp.o main.o
    别的
        MODULES = RenderingEngine2.o RenderingEngine1.o LinuxApp.o main.o
    万一
  • 沿着 Makefile 有一个名为 emscripten.sh 的 bash 脚本,其内容如下:
    #!/bin/bash

    制作 TARGET="WEB" CXX="em++ -DWEB" AR="emar" 模块
    使 TARGET="WEB" CXX="em++ -DWEB" AR="emar"
    emcc --preload-file assets -o bin/helloArrow.html bin/helloArrow bin/lib.o
    firefox bin/helloArrow.html
  • 使用 ./emscripten.sh 编译并执行

注意:emscripten 似乎不喜欢静态库中的 .a 扩展名,所以用 .o 扩展名命名你的库。

于 2013-06-16T10:30:39.237 回答