我试图在NaCl Development Environment中运行一个简单的命令行应用程序。但我不明白为什么它不想打开文件:
#include <stdio.h>
#include <ppapi_simple/ps_main.h>
int my_main (int argc, char ** argv) {
FILE * f = fopen ("out.txt","w");
if (f) {
fputs ("output to the file", f);
fclose(f);
} else {
puts("could not open file");
}
}
PPAPI_SIMPLE_REGISTER_MAIN(my_main)
运行:
bash.nmf-4.3$ gcc -I"$NACL_SDK_ROOT/include" test.c -lppapi_simple -lnacl_io -lppapi
bash.nmf-4.3$ ./a.out
could not open file
bash.nmf-4.3$
应用程序显然可以在开发环境中的任意位置打开文件 - 我使用nano编辑测试代码!但是纳米doesn't look like it's been changed的naclports版本会立即连接到文件操作..?
Lua是appears to have only been modified very slightly的另一款应用。它介于两者之间,因为它可以运行测试文件,但前提是它们放在/mnt/html5
中,并且不会从主文件夹加载它们。如果我将其更改为/mnt/html5
,那么我的测试程序在行为上没有显示出差异。
NB。我的目标是构建一个终端应用程序,我可以在开发环境中使用Lua和nano等,而不是基于浏览器的应用程序 - 我认为这对文件处理规则有所不同。
答案 0 :(得分:2)
在NaCl Dev Environment中运行的程序当前需要与-lcli_main
(后者依赖于-lnacl_spawn
)链接,以获得了解如何与{{{}中的javascript“内核”进行通信的入口点1}}。他们需要知道它们运行的当前工作目录,以及有关已安装文件系统的信息。
可以运行仅针对ppapi_simple链接的程序,但不会设置开发环境可能期望的所有挂载点。
dev env中有一个链接描述文件,可以简化命令行程序naclprocess.js
的链接。例如,问题中的测试程序可以编译为:
-lmingn
注意:此链接描述文件有一个最近解决的问题,修复程序的新版本已于2015年5月5日发布到商店。
在不久的将来,我们计划通过允许gcc test.c -o test -lmingn
成为切入点来进一步简化事情。
感谢您指出lua端口缺少新的切入点! 我已经提交了一个问题,并将尽快修复它: https://code.google.com/p/naclports/issues/detail?id=215
答案 1 :(得分:0)
我找到了解决方案,但我并不完全明白它在做什么。事实证明,纳米的微小变化非常重要,因为它们会导致NaCl库中其他地方的其他功能被正确设置环境以进行文件处理。
如果上述文件更改为:
#include <stdio.h>
int nacl_main (int argc, char ** argv) {
FILE * f = fopen ("out.txt","w");
if (f) {
fputs ("output to the file", f);
fclose(f);
} else {
puts("could not open file");
}
}
...并使用另外两个库进行编译:
gcc -I"$NACL_SDK_ROOT/include" test.c -lppapi_simple -lnacl_io -lppapi -lcli_main -lnacl_spawn
...然后它将按预期工作并写入文件。
不是使用main
注册我们自己的非PPAPI_SIMPLE_REGISTER_MAIN
函数,而是引入cli_main
会导致它使用内部函数来设置某些内容,可能包括需要的内容使文件写入工作,然后期望能够调用nacl_main
,这是留给程序定义的外部可见性(几层虚假 - main
堆叠正在进行中)。这就是纳米变化如此微小的原因。
nacl_spawn
需要关联,因为cli_main
将其用于......某事。