【问题标题】:How can I conditionally compile code for emscripten?如何有条件地为 emscripten 编译代码?
【发布时间】:2013-06-08 05:25:48
【问题描述】:

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

不过,似乎没有关于该主题的任何文档,这对我来说似乎很糟糕,我也找不到任何关于它的问题,这对我来说似乎很令人惊讶——我希望它会被广泛使用并且- 记录的领土。

我该怎么做?

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

【问题讨论】:

    标签: conditional-compilation emscripten


    【解决方案1】:

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

    在 2016 年 10 月,a strict build mode was introduced 启用后会删除 EMSCRIPTEN 定义。因此建议使用EMSCRIPTEN,即使它仍然可以在非严格构建模式下工作。

    【讨论】:

      【解决方案2】:

      #ifdef EMSCRIPTEN 是 AFAIK 的首选方式。

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

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

      【讨论】:

        【解决方案3】:

        这是我目前的解决方案:

        • 我有一个带有常用目标的 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 扩展名命名您的库。

        【讨论】:

          猜你喜欢
          • 2020-02-06
          • 1970-01-01
          • 2013-08-26
          • 2019-10-12
          • 1970-01-01
          • 1970-01-01
          • 2018-04-07
          • 1970-01-01
          • 2011-05-30
          相关资源
          最近更新 更多