Javascript 如何在命令行上将文件名传递给emscripten编译的节点脚本?

Javascript 如何在命令行上将文件名传递给emscripten编译的节点脚本?,javascript,emscripten,Javascript,Emscripten,在使用emscripten编译的C程序中打开用户指定的文件时遇到问题(正在通过节点运行)。以这个简单的cat类程序为例: #include <stdio.h> #define BUFSIZE 100 int main( int argc, char *argv[] ) { char *filename; FILE *file; char buf[BUFSIZE]; if (argc != 2) { fprintf (stderr, "Usage: %s

在使用emscripten编译的C程序中打开用户指定的文件时遇到问题(正在通过节点运行)。以这个简单的
cat
类程序为例:

#include <stdio.h>

#define BUFSIZE 100

int main( int argc, char *argv[] )
{
  char *filename;
  FILE *file;
  char buf[BUFSIZE];

  if (argc != 2) {
    fprintf (stderr, "Usage: %s <filename>\n", argv[0]);
    return 1;
  }

  file = fopen (argv[1], "r");
  while (fgets (buf, BUFSIZE, file))
    fputs (buf, stdout);

  fclose (file);

  return 0;
}
它运行并需要一个参数:

% node a.out.js 
Usage: /bin/this.program <filename>
最后我想在浏览器环境中加载文件。。。我知道这是一个完全不同的球赛,文件预加载等。。。。现在我只想让命令行工作

更新为添加:查看后,我尝试预加载文件,但出现了另一个错误:

% /usr/local/src/emscripten/emcc mycat.c --preload-file somefile
...
% node a.out.js somefile

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
ReferenceError: XMLHttpRequest is not defined
    at...
这是否意味着我需要在浏览器中运行它

再次更新以添加:

% /usr/local/src/emscripten/emcc mycat.c -o mycat.html --preload-file README.md
clang: warning: argument unused during compilation: '-nostdinc++'
% open mycat.html 
浏览器窗口显示“准备…”,控制台日志显示错误:

XMLHttpRequest cannot load file://localhost/path/to/mycat.data. Cross origin requests are only supported for HTTP. mycat.html:1
Uncaught Error: NETWORK_ERR: XMLHttpRequest Exception 101 mycat.html:2816
still waiting on run dependencies: mycat.html:61
dependency: fp somefile mycat.html:61
dependency: datafile_mycat.data mycat.html:61
(end of list) 
…然后,从“仍在等待运行依赖项:mycat.htm”开始的最后四行每隔几秒钟重复一次


不知何故,我需要在javascript端用FS准备这些文件系统调用吗?

。错误跨源请求仅支持HTTP,这意味着您的浏览器不允许直接从硬盘加载网页

有些浏览器支持命令行参数来启用此功能,但我强烈建议您只需在简单的HTTP服务器上运行web页面。使用Python很容易做到这一点:

  • 在应用程序文件夹中打开命令提示符
  • 执行
    python-msimplehttpserver
  • 将浏览器指向
    http://127.0.0.1:8000
  • 我们不支持直接加载文件,所有内容都必须在虚拟FS中。您可以使用--embed file或--preload file。理论上,我们可以支持在node中直接加载文件,因为它有同步API,但还没有人完成这项工作--克里普肯
    % clang --version
    clang version 3.2 (tags/RELEASE_32/final)
    ...
    % node --version
    v0.6.15
    % python --version
    Python 2.7.1
    % /usr/local/src/emscripten/emcc --version
    emcc (Emscripten GCC-like replacement) 1.3.6 (commit 17da251d334ce62d633d51f874b92e19ad9dbf45)
    ...
    
    % /usr/local/src/emscripten/emcc mycat.c --preload-file somefile
    ...
    % node a.out.js somefile
    
    node.js:201
            throw e; // process.nextTick error, or 'error' event on first tick
                  ^
    ReferenceError: XMLHttpRequest is not defined
        at...
    
    % /usr/local/src/emscripten/emcc mycat.c -o mycat.html --preload-file README.md
    clang: warning: argument unused during compilation: '-nostdinc++'
    % open mycat.html 
    
    XMLHttpRequest cannot load file://localhost/path/to/mycat.data. Cross origin requests are only supported for HTTP. mycat.html:1
    Uncaught Error: NETWORK_ERR: XMLHttpRequest Exception 101 mycat.html:2816
    still waiting on run dependencies: mycat.html:61
    dependency: fp somefile mycat.html:61
    dependency: datafile_mycat.data mycat.html:61
    (end of list)