我如何有条件地编译emscripten的代码?

时间:2013-06-12 07:18:40

标签: conditional-compilation emscripten

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

似乎没有关于这个主题的任何文档,这对我来说似乎很差,我也无法找到任何关于它的问题,这对我来说似乎非常令人惊讶 - 我预计它会被很好地践踏 - 文件领域。

我该怎么做?

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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

#ifdef EMSCRIPTEN是AFAIK首选的方式。

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

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

答案 2 :(得分:2)

这是我目前的解决方案:

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

  • 代码使用ifdefs作用于WEB定义。

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

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

    make TARGET="WEB" CXX="em++ -DWEB" AR="emar" modules
    make 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扩展名命名库。