使用 Clang 编译的可执行文件中的 emscripten
Use emscripten from Clang compiled executable
是否可以在 clang 编译的可执行文件上执行 emcc(来自 emscripten)?
我试过了,但结果是:
ERROR root: pdfium_test: Input file has an unknown suffix, don't know what to do with it!
我尝试这样做是因为我找不到使用 emcc 编译 PDFium 项目的解决方案,但是使用 clang 一切都很好。
原因是:
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.
但是 PDFium 中有很多特定于平台的代码,所以我得到:
#error Sorry, can not figure out target OS. Please specify _FX_OS_ macro.
如果定义了__linux__宏(例如),则定义此宏,这里是代码片段:
#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
所以,我尝试手动定义 __linux__ 宏:
emmake make -j5 BUILDTYPE=Release __linux__=1
...但同样的错误。也许这不是好方法?
提前致谢。
编辑: JF Bastien 的回答对我帮助很大。但现在我遇到了这个构建错误,我知道该怎么做。如果有人有想法...
clang-3.7: warning: argument unused during compilation: '-msse2'
clang-3.7: warning: argument unused during compilation: '-mmmx'
error: unknown FP unit 'sse'
编辑 2: 上述问题的解决方案:从 v8/build/toolchain.gypi
中删除“-msse2、-mmmx 和 -mfpmath”标志
移植到 Emscripten 与移植到任何其他平台相同:您必须使用该平台自己的 platform-specific headers。有些会有很好的等价物,有些则没有。
在大多数情况下,您需要找到 platform-specific #if defined(...)
的这些链并添加一个 #elif defined(__EMSCRIPTEN__)
,然后在那里做正确的事情。这比听起来更复杂:你不能进行内联汇编,你不能依赖(大多数)platform-specific headers,......但在某些情况下它很容易。
Emscripten 有 examples which do this, and has a porting guide.
特别是对于 PDFium,您必须避免所有 platform-specific 字体渲染、任何 threading-related 事情和沙盒(安全性不应该是一个大问题,因为 JavaScript本身就是一个沙箱)。您还必须弄清楚如何执行文件 I/O,并且可能想要禁用所有网络代码。
或者您可以使用 other ports of PDFium to Emscripten.
是否可以在 clang 编译的可执行文件上执行 emcc(来自 emscripten)?
我试过了,但结果是:
ERROR root: pdfium_test: Input file has an unknown suffix, don't know what to do with it!
我尝试这样做是因为我找不到使用 emcc 编译 PDFium 项目的解决方案,但是使用 clang 一切都很好。
原因是:
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.
但是 PDFium 中有很多特定于平台的代码,所以我得到:
#error Sorry, can not figure out target OS. Please specify _FX_OS_ macro.
如果定义了__linux__宏(例如),则定义此宏,这里是代码片段:
#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
所以,我尝试手动定义 __linux__ 宏:
emmake make -j5 BUILDTYPE=Release __linux__=1
...但同样的错误。也许这不是好方法?
提前致谢。
编辑: JF Bastien 的回答对我帮助很大。但现在我遇到了这个构建错误,我知道该怎么做。如果有人有想法...
clang-3.7: warning: argument unused during compilation: '-msse2'
clang-3.7: warning: argument unused during compilation: '-mmmx'
error: unknown FP unit 'sse'
编辑 2: 上述问题的解决方案:从 v8/build/toolchain.gypi
中删除“-msse2、-mmmx 和 -mfpmath”标志移植到 Emscripten 与移植到任何其他平台相同:您必须使用该平台自己的 platform-specific headers。有些会有很好的等价物,有些则没有。
在大多数情况下,您需要找到 platform-specific #if defined(...)
的这些链并添加一个 #elif defined(__EMSCRIPTEN__)
,然后在那里做正确的事情。这比听起来更复杂:你不能进行内联汇编,你不能依赖(大多数)platform-specific headers,......但在某些情况下它很容易。
Emscripten 有 examples which do this, and has a porting guide.
特别是对于 PDFium,您必须避免所有 platform-specific 字体渲染、任何 threading-related 事情和沙盒(安全性不应该是一个大问题,因为 JavaScript本身就是一个沙箱)。您还必须弄清楚如何执行文件 I/O,并且可能想要禁用所有网络代码。
或者您可以使用 other ports of PDFium to Emscripten.