问题:使用emscripten从jmodelica编译FMU c代码

时间:2019-07-09 12:58:57

标签: emscripten fmi jmodelica

问题

如果我尝试使用emcc编译c代码(从JModelica导出的FMU),则会收到错误消息,提示未找到头文件“ gnu / stubs-32.h”。

    Intent repeatIntent = new Intent(this, repeatDialog.class);
startActivity(repeatIntent);

错误

emcc -I /usr/include/ -I /usr/include/x86_64-linux-gnu/ -I /usr/include/x86_64-linux-gnu/bits/ -I /home/osboxes/Programme/JModelica/include/RuntimeLibrary/ -I /home/osboxes/Programme/JModelica/ThirdParty/FMI/2.0/ BouncingBall.c

我已经尝试通过安装libc6-dev:i386为编译器提供所需的头文件。但是,由于在64位计算机上编译32位软件,因此无法正常工作。 guys from emscripten已经告诉我,没有可用的32位版本的emcc编译器。所以我认为唯一的方法就是继续使用64位...

我在gnu / stubs.h中找到了负责选择错误头文件的文件:

/usr/include/x86_64-linux-gnu/gnu/stubs.h:7:11 fatal error: 'gnu/stubs-32.h' file not found

因此,我得出结论,#if !defined __x86_64__ # include <gnu/stubs-32.h> #endif #if defined __x86_64__ && defined __LP64__ # include <gnu/stubs-64.h> #endif #if defined __x86_64__ && defined __ILP32__ # include <gnu/stubs-x32.h> #endif 没有定义,但是应该定义为能够使用64位头文件。

有人知道我如何使用emcc编译C代码吗?


我的环境:

  • Ubuntu 18.10(64位)
  • JModelica(版本r12614)
  • 脚本(emcc:1.3820 / clang:6.0.1 /目标:x86_64-unknown-linux-gnu /选定的gcc:/ usr / lib / gcc / x86_64-linux-gnu / 8)

2 个答案:

答案 0 :(得分:0)

首先,为什么需要显式指定系统头?

  • 如果您只想链接到libc,则默认情况下应该实现
  • 如果需要一些特定的库,则必须自行构建,但是对于某些库(例如Zlib或SDL),您可以使用emcc Emscripten Ports机制>

关于编译器的重要性:您可能使用64位emcc编译器(我不知道它是否以32位可执行文件存在,我使用64位位),但它生成的代码目前是AFAIK固有的32位。

同时,您是否专门与JModelica绑定?我不熟悉JModelica,但是Linux上的OpenModelica生成的FMU带有sources脚本内的configure目录,因此一个人可能会运行类似emconfigure ./configure CC=-m32的东西(因此它如果意外地从emconfigure回退到本机编译(如果仍然适用),它将定位32位代码。然后,您可以使用emmake make等,如Emscripten文档中所述。希望OpenModelica的运行时许可证可以接受...

与此同时,Modelica by Example书already uses以某种方式通过OpenModelica + Emscripten提供浏览器内仿真。

答案 1 :(得分:0)

JModelica的FMU的源文件夹仅包含c文件。那就是为什么我必须从其他地方获取头文件。

JModelica: sources folder in the FMU

OpenModelica: sources folder in the FMU