首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题:用emscripten从jmodelica编译FMU c-代码

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

Stack Overflow用户
提问于 2019-07-09 12:58:57
回答 2查看 340关注 0票数 2

问题

如果我试图用emcc编译c代码(来自JModelica导出的FMU ),就会发现头文件"gnu/stubs-32.h“没有找到。

代码语言:javascript
复制
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

错误

代码语言:javascript
复制
/usr/include/x86_64-linux-gnu/gnu/stubs.h:7:11 fatal error: 'gnu/stubs-32.h' file not found

我已经尝试通过安装libc6-dev:i 386为编译器提供所需的头文件。但由于在64位机器上编译32位软件,它将无法工作。征召来的人已经告诉我,emcc编译器没有工作的32位版本。所以我认为唯一的办法是继续64位.

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

代码语言:javascript
复制
#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/ visited s.h’的文件。它是JModelica的一个名为/../JModelica/include/RuntimeLibrary/jmi_utils.h的头文件。

代码语言:javascript
复制
...
#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-linux-gnu/精选gcc: /usr/lib/gcc/x86_64-linux-gnu/8)
EN

回答 2

Stack Overflow用户

发布于 2019-07-11 08:22:32

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

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

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

同时,您是否专门与JModelica绑定?我对JModelica并不熟悉,但是Linux上的OpenModelica会生成带有带有configure脚本的sources目录的FMU,因此很可能会运行类似emconfigure ./configure CC=-m32的代码(因此,当它意外地从emconfigure返回到本地编译时,它将针对32位代码,如果它仍然适用的话)。然后,您可以使用emmake make等,就像在Emscripten文档中解释的那样。希望OpenModelica运行时的许可是可以接受的.

同时,Modelica通过实例书已用 OpenModelica+Emscripten提供了浏览器内的模拟.

票数 0
EN

Stack Overflow用户

发布于 2019-07-22 08:57:02

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

JModelica: FMU中的“源”文件夹

OpenModelica: FMU中的“源”文件夹

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56953172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档