【问题标题】:Problem: Compile FMU c-code from jmodelica with emscripten问题:使用 emscripten 从 jmodelica 编译 FMU c 代码
【发布时间】:2019-11-19 01:06:25
【问题描述】:

问题

如果我尝试使用 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 位软件。 guys from 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 / Target: x86_64-unknown-linux-gnu / selected gcc: /usr/lib/gcc/x86_64-linux-gnu/8)

【问题讨论】:

  • 正如有人在关联。由于浏览器/WASM 环境,Emscripten 使用自己的 libc(它源自 musl,甚至不是源自 GNU)。
  • 谢谢您的回答,您的意思是我需要使用 emsctipten 的头文件来代替?或者这是否意味着 JModelica 应该为目标环境提供所需的头文件?对不起,我是编译代码的血腥初学者......
  • 我在 JModelica 方面没有经验,但我一般来说是为了编译 Emscripten 应用程序。虽然标头 gnu/xxxx.h 听起来像是 GNU 特定的东西,但 Emscripten 系统标头通常位于 emsdk_path/emscripten/incoming/system/,因此您可以尝试查找所需的标头。如果我是你,我会问 JModelica 的人是否有办法抛弃 GNU 存根标头。

标签: emscripten fmi jmodelica


【解决方案1】:

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

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

关于编译器的位数:你大概用的是64位的emcc编译器(不知道是否作为32位的可执行文件存在,我用的是64位的一),但它生成的 代码 目前是 AFAIK 固有的 32 位。

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

同时,Modelica by Example 一书already uses 以某种方式通过 OpenModelica+Emscripten 提供浏览器内模拟。

【讨论】:

  • 我使用 JModelica 是因为 OpenModelica 只为导出的 FMU 提供欧拉积分求解器。在许多情况下,此求解器是不可接受的。我将尝试按照您的说明进行编译... thx
  • emconfigure ./configure CC=-m32 不起作用,因为 JModelica 的源文件夹中没有 configure 脚本。查看JModelica的FMU中sources文件夹的图片
【解决方案2】:

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

JModelica: sources folder in the FMU

OpenModelica: sources folder in the FMU

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2011-07-07
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多