【问题标题】:Can't compile libpd with emmake (Emscripten SDK)无法使用 emmake (Emscripten SDK) 编译 libpd
【发布时间】:2018-10-31 22:05:51
【问题描述】:

我正在尝试使用 emscripten sdk 将 libpd 编译为 javascript 或 webassembly。根据一些文档,如果有 Makefile,可以使用emmake make 编译,(没有使用 emconfigure,因为没有 ./configure 文件),但我收到以下错误:

/home/ian/Documents/emsdk/emscripten/1.37.37/emcc.py -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -fPIC -I"/usr/lib/jvm/default-java/include/linux" -DHAVE_LIBDL -ffast-math -funroll-loops -fomit-frame-pointer -O3 -DLIBPD_EXTRA      -c -o pure-data/src/d_array.o pure-data/src/d_array.c
pure-data/src/d_array.c:523:2: error: No byte order defined
#error No byte order defined
 ^
1 error generated.
ERROR:root:compiler frontend failed to generate LLVM bitcode, halting
<integrado>: fallo en las instrucciones para el objetivo 'pure-data/src/d_array.o'
make: *** [pure-data/src/d_array.o] Error 1

有什么想法吗?你认为可以编译这个库吗?

更新:按照@zakki 的回答中的建议调整每个投诉文件后 我收到另一个错误:

libpd_wrapper/util/ringbuffer.c:18:12: fatal error: 'stdatomic.h' file not found
  #include <stdatomic.h>

那个文件有这个内容:

#if __STDC_VERSION__ >= 201112L // use stdatomic if C11 is available
  #include <stdatomic.h> // HERE IS WHERE ERROR GOES
  #define SYNC_FETCH(ptr) atomic_fetch_or((_Atomic int *)ptr, 0)
  #define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \
          atomic_compare_exchange_strong((_Atomic int *)ptr, &oldval, newval)
//Some other definitions that I didn't put here

我前段时间读过一些关于 C++11 的这个问题的帖子,我该如何解决这个问题?

更新 2:添加 &amp;&amp; !defined(__EMSCRIPTEN__) 后现在可以编译,但我收到了这个我不明白的警告:

警告:root:动态库(.so、.dylib、.dll)目前不支持 由 Emscripten 支持。出于构建系统仿真的目的, Emscripten 现在将生成一个静态库文件 (.bc),其中包含 后缀“.so”。为了获得最佳实践,请调整您的构建系统以 通过设置输出直接生成静态 LLVM 位码库 '.bc.'的后缀)

【问题讨论】:

  • 如果你编译为 C++11,那将是一个问题。 &lt;stdatomic.h&gt; is an (optional) C11 feature。 C++11 使用&lt;atomic&gt;。您的代码是 C,而不是 C++,因此请确保使用 C 编译器对其进行编译。顺便说一句,该库应该(至少在理论上)还检查 !defined(__STDC_NO_ATOMICS__),因为 __STDC_VERSION__ &gt;= 201112L 不保证支持原子。
  • 也许SOLIB_EXT in Makefile 应该是js,并且需要一些额外的代码来导出函数。 kripken.github.io/emscripten-site/docs/porting/…
  • mathr.co.uk/empd 我最近已经完成了它的工作,动态链接很痛苦(到目前为止,我正在静态链接所有外部并调用它们的 foo_setup() 函数)。更难(但并非不可克服)是 Emscripten 坚持不将不同类型的函数指针调用到函数的真实类型。
  • 不错!我会检查你的工作

标签: llvm-clang emscripten webassembly stdatomic libpd


【解决方案1】:

Emscripten 有endian.h。所以在 ifdef 中添加defined(__EMSCRIPTEN__)

#if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \
    defined(ANDROID) || defined(__EMSCRIPTEN__)
#include <endian.h>
#endif

第二,好像是Emscripten bug

#if __STDC_VERSION__ >= 201112L && !defined(__EMSCRIPTEN__)

【讨论】:

  • 这帮助我解决了这个问题,但现在我又得到了一个。我更新了帖子来描述它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多