2

问题

如果我尝试使用 emcc 编译 c 代码(来自 JModelica 导出的 FMU),我会收到一个错误,即找不到头文件“gnu/stubs-32.h”。

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

错误

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

我已经尝试通过安装 libc6-dev:i386 为编译器提供所需的头文件。但它不起作用,因为在 64 位机器上编译 32 位软件。来自 emscripten的人已经告诉我,没有可用的 32 位版本的 emcc 编译器。所以我认为唯一的方法是继续使用64位......

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

#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

因此我得出结论,__LP64__没有定义但应该定义为能够使用 64 位头文件。

有谁知道我如何能够用 emcc 编译 c 代码?

添加(添加 16.08.2019)

我又开始了一次尝试:

不使用系统头文件进行编译emcc -I /home/osboxes/Programme/JModelica/include/RuntimeLibrary/ -I /home/osboxes/Programme/JModelica/ThirdParty/FMI/2.0/ BouncingBall.c会导致此错误'linux/limits.h' file not found

所以我访问了包含“linux/limits.h”的文件。它是 JModelica 的头文件,名称为/../JModelica/include/RuntimeLibrary/jmi_utils.h

...
#if !defined(NO_FILE_SYSTEM) && (defined(RT) || defined(NRT))
#define NO_FILE_SYSTEM
#endif

#ifndef NO_FILE_SYSTEM    
    #ifdef _WIN32
      #include <windows.h>
      #define JMI_PATH_MAX MAX_PATH
    #else
      #define _GNU_SOURCE
      #include <dlfcn.h>
      #ifdef __APPLE__
        #include <limits.h>
        #define JMI_PATH_MAX PATH_MAX
      #else
        #include <linux/limits.h>
        #define JMI_PATH_MAX PATH_MAX
      #endif
    #endif

    #include <sys/types.h>
    #include <sys/stat.h>
#endif
...

所以我通过传递emcc -I /home/osboxes/Programme/JModelica/include/RuntimeLibrary/ -I /home/osboxes/Programme/JModelica/ThirdParty/FMI/2.0/ BouncingBall.c -DRT给 emcc 编译器来定义“RT”,一切正常工作。

但是变量 RT 和 NRT 是什么?这样做我是否需要担心一些事情?


我的环境:

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

2 回答 2

0

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

JModelica:FMU 中的源文件夹

OpenModelica:FMU 中的源文件夹

于 2019-07-22T08:57:02.587 回答
0

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

  • 如果您只想链接到,libc那么它应该默认实现
  • 如果您需要一些特定的库,那么您必须自己构建它,但对于某些库,例如 Zlib 或 SDL,您可以使用内置emcc

关于编译器的位数:您可能使用 64 位emcc编译器(我不知道它是否作为 32 位可执行文件存在,我使用 64 位的),但它生成的代码本质上是 AFAIK 32-暂时。

同时,您是否专门与 JModelica 相关联?我对 JModelica 不熟悉,但Linux 上的OpenModelicasources使用脚本生成 FMU,其中的目录带有configure脚本,因此可能会运行类似的东西emconfigure ./configure CC=-m32(因此emconfigure,如果它仍然是适用的)。然后您可以使用emmake make等,如 Emscripten 文档中所述。希望 OpenModelica 运行时的许可证是可以接受的......

同时,Modelica by Example 一书已经以某种方式使用 OpenModelica+Emscripten 来提供浏览器内模拟。

于 2019-07-11T08:22:32.207 回答