Use emscripten from Clang compiled executable

时间:2015-06-15 15:11:50

标签: c++ c clang emscripten

Is it possible to execute emcc (from emscripten) on a clang compiled executable ?

I tried but the result is:

ERROR root: pdfium_test: Input file has an unknown suffix, don't know what to do with it!

I try that because I'm not able to find a solution to compile PDFium project with emcc, but with clang everything is fine.

The reason is:

Emscripten is a cross-compiler, and therefore the OS-specific macros of the host system should all be undefined when building C/C++ code. If you look at tools/shared.py, Emscripten gives special attention to -U all host-specific flags that Clang may automatically try to add in.

But there is lots of Platform specific code in PDFium, so I get:

#error Sorry, can not figure out target OS. Please specify _FX_OS_ macro.

This macro is defined if the __linux__ macro (for example) is defined, here is the code snippet:

#ifndef _FX_OS_
#if defined(__ANDROID__)
#define _FX_OS_ _FX_ANDROID_
#define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_
#elif defined(_WIN32)
#define _FX_OS_ _FX_WIN32_DESKTOP_
#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
#elif defined(_WIN64)
#define _FX_OS_ _FX_WIN64_DESKTOP_
#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
#elif defined(__linux__)
#define _FX_OS_ _FX_LINUX_DESKTOP_
#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
#elif defined(__APPLE__)
#define _FX_OS_ _FX_MACOSX_
#define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_
#endif
#endif  // _FX_OS_ 

#if !defined(_FX_OS_) || _FX_OS_ == 0
#error Sorry, can not figure out target OS. Please specify _FX_OS_ macro.
#endif

So, I tried to define manually the __linux__ macro with:

emmake make -j5 BUILDTYPE=Release __linux__=1

... but same error. Maybe it's not the good way ?

Thank you in advance.

EDIT: The answer of JF Bastien helps me a lot. But now I've this build error and I've any idea of what to do. If someone have an idea...

clang-3.7: warning: argument unused during compilation: '-msse2'
clang-3.7: warning: argument unused during compilation: '-mmmx'
error: unknown FP unit 'sse'

EDIT 2: Solution for above problem: remove "-msse2, -mmmx and -mfpmath" flags from v8/build/toolchain.gypi

1 个答案:

答案 0 :(得分:3)

移植到Emscripten与移植到任何其他平台相同:您必须使用该平台自己的平台特定标头。有些人会有很好的等价物,有些人不会。

在大多数情况下,您需要找到这些特定于平台的#if defined(...)链并添加#elif defined(__EMSCRIPTEN__),并在那里做正确的事情。这比听起来更复杂:你不能进行内联汇编,你不能依赖(大多数)平台特定的标题,......但在某些情况下它很容易

Emscripten有examples which do this,并且有porting guide

对于PDFium,您必须避免所有特定于平台的字体呈现,任何与线程相关的事情以及沙盒(安全性不应该是问题,因为JavaScript本身就是一个沙箱)。您还必须弄清楚如何进行文件I / O,并且可能想要禁用所有网络代码。

或者您可以使用other ports of PDFium to Emscripten

相关问题