【发布时间】: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