使用支持构建多个操作系统的代码库,只需要对Emscripten进行修改,将它们集成到相同的代码库中,在条件编译的帮助下,让它继续在其他环境中工作是明智的
似乎没有关于这个主题的任何文档,这对我来说似乎很差,我也无法找到任何关于它的问题,这对我来说似乎非常令人惊讶 - 我预计它会被很好地践踏 - 文件领域。
我该怎么做?
(我看过tools/shared.py
,这似乎表明可以使用#ifdef EMSCRIPTEN
或#ifdef __EMSCRIPTEN__
;我仍然会问这个问题,以确定我是否正确,如果这样是这样做的正确方法,甚至应该使用它。)
答案 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
#!/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似乎不喜欢静态库中的.a扩展名,所以用.o扩展名命名库。