我正在尝试使用emscripten sdk将libpd编译为javascript或webassembly。根据一些文档,如果有一个Makefile,可以使用emmake make
进行编译,(因为没有./configure文件,因此没有使用emconfigure),但是我收到以下错误:
/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:添加&& !defined(__EMSCRIPTEN__)
之后现在能够编译,但是我收到了这个警告,我不明白:
警告:root:动态库(.so,.dylib,.dll)目前不是 由Emscripten支持。对于构建系统仿真的目的, Emscripten现在将生成一个静态库文件(.bc) 后缀'.so'。要获得最佳实践,请调整您的构建系统 通过设置输出直接生成静态LLVM bitcode库 后缀为'.bc。')
答案 0 :(得分:3)
Emscripten有endian.h
。所以将defined(__EMSCRIPTEN__)
添加到ifdef。
#if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \
defined(ANDROID) || defined(__EMSCRIPTEN__)
#include <endian.h>
#endif
其次,它似乎是Emscripten bug。
#if __STDC_VERSION__ >= 201112L && !defined(__EMSCRIPTEN__)